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/9/24 9:23:32 阅读更多 →
MT4/MT5回测报告怎么看?3分钟教你识别“造假“回测数据

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

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

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

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

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

2026/9/20 22:18:50 阅读更多 →

最新新闻

第三方短信API接入实战:签名算法、回调与避坑指南

第三方短信API接入实战:签名算法、回调与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:23:37 阅读更多 →
FPGA无PHY光口方案:GT高速收发器直连SFP实现吉比特UDP通信

FPGA无PHY光口方案:GT高速收发器直连SFP实现吉比特UDP通信

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:23:37 阅读更多 →
Hadoop SequenceFile实战:Eclipse中生成与读取详解

Hadoop SequenceFile实战:Eclipse中生成与读取详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:23:37 阅读更多 →
RK1828 4卡级联端侧跑通27B大模型:部署实战与踩坑指南

RK1828 4卡级联端侧跑通27B大模型:部署实战与踩坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:23:37 阅读更多 →
CM201-2免拆刷机全攻略:绕过BootROM签名与SELinux封锁

CM201-2免拆刷机全攻略:绕过BootROM签名与SELinux封锁

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:23:37 阅读更多 →
STM32F4无感FOC低速优化:PLL锁相环替代滑膜观测器实战

STM32F4无感FOC低速优化:PLL锁相环替代滑膜观测器实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:22:36 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →