sosdp
零、写在前面随便写写。子集和超集和的计算就是高维前后缀和子集反演超集反演的计算就是高维前后缀差分。还是比较easy的。一、SOS DP1.1 高维前缀和SOS DP (Sum Over Subsets Dynamic Programming)也被称为高维前缀和是算法竞赛中处理位运算尤其是子集、超集问题的一项极为优雅和高效的技巧。给定一个大小为2 n 2^n2n的数组A AA下标从0 00到2 n − 1 2^n-12n−1我们需要计算一个新数组F FF使得F [ m a s k ] ∑ i ⊆ m a s k A [ i ] F[mask] \sum_{i \subseteq mask} A[i]F[mask]i⊆mask∑​A[i]注i ⊆ m a s k i \subseteq maski⊆mask表示i ii是m a s k maskmask的子集即(i mask) i1. 暴力做法O ( 3 n ) O(3^n)O(3n)最直观的做法是对于每个m a s k maskmask枚举它的所有子集for (int mask 0; mask (1 n); mask) { F[mask] A[0]; for (int i mask; i 0; i (i - 1) mask) { // 经典枚举子集位运算技巧 F[mask] A[i]; } }3. 高维前缀和O ( n ⋅ 2 n ) O(n \cdot 2^n)O(n⋅2n)思考初学算法的时候怎么求一维数组前缀和——从左往右扫一遍。怎么求二维数组前缀和不用一次遍历的容斥写法——先对每一行做一维前缀和再对每一列做一维前缀和。扩展到n维——依次对第0 00维、第1 11维、…、第n − 1 n-1n−1维做一维前缀和。状态定义d p [ i ] [ m a s k ] dp[i][mask]dp[i][mask]表示在只允许改变m a s k maskmask的前i ii位即第0 00到第i − 1 i-1i−1位的前提下所有子集的和。状态转移考虑m a s k maskmask的第i ii位如果m a s k maskmask的第i ii位是0它的子集在这一位也必须是0所以d p [ i ] [ m a s k ] d p [ i − 1 ] [ m a s k ] dp[i][mask] dp[i-1][mask]dp[i][mask]dp[i−1][mask]。如果m a s k maskmask的第i ii位是1它的子集在这一位可以是0也可以是1。因此d p [ i ] [ m a s k ] d p [ i − 1 ] [ m a s k ] d p [ i − 1 ] [ m a s k ⊕ ( 1 ≪ i ) ] dp[i][mask] dp[i-1][mask] dp[i-1][mask \oplus (1 \ll i)]dp[i][mask]dp[i−1][mask]dp[i−1][mask⊕(1≪i)]。空间优化滚动数组因为d p [ i ] dp[i]dp[i]只依赖于d p [ i − 1 ] dp[i-1]dp[i−1]我们可以省去第一维for(inti0;in;i){// 枚举维度for(intmask0;mask(1n);mask){// 枚举所有状态if(mask(1i)){// 如果第 i 位是 1F[mask]F[mask^(1i)];// 加上第 i 位为 0 的状态}}}1.2 存在性与最值问题SOS DP 不仅仅能求和只要满足结合律和交换律的操作如 max⁡,min⁡按位或/与都可以用 SOS DP。一个经典问题E. Compatible Numbers对数组中每个数A[i] 找到 一个 A[j] 使得 A[i] A[j] 0。我们利用 sosdp 求子集max然后每个数的答案就是 dp[~A[i] U]代码实现(C#)public void Solve() { int n br.ReadInt32(); int[] a br.ReadInt32(n); int U 1 (int.Log2(a.Max()) 1); int[] dp new int[U]; foreach (var x in a) { dp[x] x; } for (int i 0; i 30; i) { for (int s 1; s U; s) { if ((s i 1) 0) { dp[s] Math.Max(dp[s], dp[s ^ (1 i)]); } } } bw.AppendJoin( , a.Select(x ~x (U - 1)).Select(x dp[x] 0 ? dp[x] : -1)); }1.3 求超集题意不求子集了求超集。即F [ m a s k ] ∑ m a s k ⊆ i A [ i ] F[mask] \sum_{mask \subseteq i} A[i]F[mask]∑mask⊆i​A[i]。这个很好求就是把高维前缀和变成高维后缀和。for(int i 0; i n; i) { for(int mask (1 n) - 1; mask 0; --mask) { // 从小到大也可以 if(!(mask (1 i))) { // 重点如果第 i 位是 0 F[mask] F[mask ^ (1 i)]; // 加上第 i 位为 1 的超集状态 } } }1.4 高维差分前/后 缀和的逆运算是差分那么高维前/后缀和 的逆运算就是高维差分。在很多场景中利用高位前缀和做高维差分被称为子集反演。利用高维后缀和做高维差分被称为超集反演。以子集反演为例子集反演的过程是从“至多”到“恰好”在组合数学中我们经常会遇到两个函数f ( S ) f(S)f(S)和g ( S ) g(S)g(S)其中S SS是一个集合。假设g ( S ) g(S)g(S)表示“恰好是集合S SS”的值而f ( S ) f(S)f(S)表示“包含于集合S SS的所有子集”的值之和即“至多”是S SS。它们的关系是f ( S ) ∑ T ⊆ S g ( T ) f(S) \sum_{T \subseteq S} g(T)f(S)T⊆S∑​g(T)如果我们已知f ff数组想要反推g gg数组这就需要用到子集反演公式g ( S ) ∑ T ⊆ S ( − 1 ) ∣ S ∣ − ∣ T ∣ f ( T ) g(S) \sum_{T \subseteq S} (-1)^{|S| - |T|} f(T)g(S)T⊆S∑​(−1)∣S∣−∣T∣f(T)(其中∣ S ∣ |S|∣S∣表示集合S SS的大小即二进制中 1 的个数)。我们发现和S 相差元素为奇数那么贡献是负的偶数贡献是正的这其实就是容斥原理的应用。代码实现很简单// 初始时 F 数组里存的是 f(S) for(int i 0; i n; i) { for(int mask 0; mask (1 n); mask) { if(mask (1 i)) { // 第 i 位是 1 F[mask] - F[mask ^ (1 i)]; // 减去第 i 位是 0 的情况 } } } // 结束时 F 数组里存的就是 g(S)Q为什么代码实现中一律全是减号Asosdp 就是沿着dag求和的过程在逐层做减法的过程中自动完成了奇偶交替符号的容斥计算。一个板题D. Jzzhu and Numbers计算有多少个子集满足按位与为0这显然需要我们做超集反演。代码实现C#其中Z是取模数public void Solve() { int n br.ReadInt32(); int[] a br.ReadInt32(n); int hi int.Log2(a.Max()) 1; int U 1 hi; Z[] dp new Z[U]; foreach (var x in a) { dp[x]; } for (int i 0; i hi; i) { for (int s 0; s U; s) { if ((s i 1) 0) { dp[s] dp[s ^ (1 i)]; } } } for (int s 0; s U; s) { dp[s] ((Z)2).Pow(dp[s].Value) - 1; } for (int i 0; i hi; i) { for (int s 0; s U; s) { if ((s i 1) 0) { dp[s] - dp[s ^ (1 i)]; } } } bw.AppendLine(dp[0].Value); }

相关新闻

XSS攻击全解析:从反射型到DOM型,实战攻防与防御策略

XSS攻击全解析:从反射型到DOM型,实战攻防与防御策略

1. 项目概述:为什么XSS攻击值得每个开发者警惕?如果你是一名Web开发者,或者负责过任何线上业务,那么“XSS”这个词对你来说一定不陌生。它就像悬在Web应用头顶的达摩克利斯之剑,看似古老,却总能以新的形式造…

2026/8/2 7:11:10阅读更多 →
MT4/MT5回测报告怎么看?3分钟教你识别“造假“回测数据

MT4/MT5回测报告怎么看?3分钟教你识别“造假“回测数据

MT4/MT5回测报告怎么看?3分钟教你识别"造假"回测数据 很多人下载EA后第一件事就是跑回测,然后看到一条漂亮的盈利曲线就上头了。 停一下。市面上至少一半的回测报告是有问题的——不是数据造假,就是用了"完美条件"跑出来…

2026/8/2 7:11:10阅读更多 →
Nature认证的AI科研工具OpenScholar:如何用AI高效完成文献综述

Nature认证的AI科研工具OpenScholar:如何用AI高效完成文献综述

1. 项目概述:当Nature开始“认证”AI工具最近在学术圈里,一个消息传得挺广:Nature杂志“认定”了一款叫OpenScholar的AI工具,说它是“论文综述神器”。这事儿挺有意思的。Nature是什么?那是全球自然科学领域的顶级期刊…

2026/8/2 7:11:10阅读更多 →
Jetson开发板全攻略:从选型到部署的避坑指南

Jetson开发板全攻略:从选型到部署的避坑指南

1. 项目概述:为什么你需要一份Jetson开发板选购与配置指南 如果你正在踏入边缘AI、机器人或者智能物联网的领域,那么NVIDIA Jetson这个名字你一定不陌生。它不是一个单一的产品,而是一个庞大的、不断演进的开发板家族,从入门级的N…

2026/8/2 8:29:28阅读更多 →
云原生高级-lvs

云原生高级-lvs

一、集群集群是将多台独立物理服务器通过网络整合为一个逻辑整体,对外统一提供服务,外部客户端仅感知到一个访问入口。集群分为两大角色:调度器 Director:流量分发入口(LVS 服务器);真实服务器 …

2026/8/2 8:29:28阅读更多 →
DownKyi终极指南:如何快速下载B站8K超高清视频并去除水印

DownKyi终极指南:如何快速下载B站8K超高清视频并去除水印

DownKyi终极指南:如何快速下载B站8K超高清视频并去除水印 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&am…

2026/8/2 8:29:28阅读更多 →
时序问答技术解析:如何让AI理解时间维度与动态推理

时序问答技术解析:如何让AI理解时间维度与动态推理

1. 当AI面对“时间”这个维度:一个被忽视的挑战 最近在跟进一些时序问答(Temporal Question Answering)相关的项目,发现一个挺有意思的现象:很多模型在回答涉及时间的问题时,表现会变得不稳定。比如&#x…

2026/8/2 8:29:28阅读更多 →
Python桌面宠物开发:从零构建鸣潮爱弥斯互动桌宠

Python桌面宠物开发:从零构建鸣潮爱弥斯互动桌宠

最近在桌面宠物社区看到不少玩家对《鸣潮》中的爱弥斯角色情有独钟,想要将其制作成互动式桌宠。这类项目不仅能让喜爱的游戏角色常驻桌面,还能通过Python编程实践面向对象设计、GUI开发和动画逻辑。本文将完整演示如何从零构建一个Codex风格的鸣潮爱弥斯…

2026/8/2 8:29:28阅读更多 →
数据增广+微调

数据增广+微调

数据增广:随机改变训练样本可以减少模型对某些属性的依赖,从而提高模型的泛化能力左右反转,上下翻转....(符合实际),切割(变形到固定形状),明亮度,色调图片增…

2026/8/2 8:27:28阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:10阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/2 0:00:12阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/2 0:00:13阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:10阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/2 0:00:12阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/2 0:00:13阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/2 1:29:34阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/2 2:32:55阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/2 2:09:20阅读更多 →