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

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

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

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

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

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

2026/8/2 7:11:12 阅读更多 →

最新新闻

云服务器API外部连接失败全链路排查指南:从网络到应用层深度解析

云服务器API外部连接失败全链路排查指南:从网络到应用层深度解析

1. 从一次深夜告警说起:API连接问题的普遍性与紧迫性凌晨两点,手机突然震动,监控告警提示:“生产环境订单服务API调用失败,错误码:Connection refused”。相信很多运维和开发朋友都经历过类似的场景。这不仅…

2026/8/2 10:53:52 阅读更多 →
从零构建一个企业级 ERP 系统:.NET 8 + Vue 全栈实战指南

从零构建一个企业级 ERP 系统:.NET 8 + Vue 全栈实战指南

这不是一篇普通的 CRUD 教程,而是一个完整的技术成长实录——从建表到分布式锁,从三层架构到接口解耦,从审计日志到熔断降级,每一步都是真实踩坑后的沉淀。 一、写在前面:为什么要造这个轮子? 很多 .NET 开…

2026/8/2 10:53:52 阅读更多 →
Linux Ubuntu与安卓设备文件传输全方案:从USB到无线实战指南

Linux Ubuntu与安卓设备文件传输全方案:从USB到无线实战指南

1. 跨系统文件交换:一个高频且真实的痛点如果你同时使用Linux Ubuntu桌面系统和安卓手机,那么在两台设备之间传文件这件事,大概率是你日常工作中的高频操作。可能是把手机拍的照片、录的视频传到电脑上剪辑处理,也可能是把电脑上写…

2026/8/2 10:53:51 阅读更多 →
华为TCX转换器:打破运动数据孤岛的高效实用工具

华为TCX转换器:打破运动数据孤岛的高效实用工具

华为TCX转换器:打破运动数据孤岛的高效实用工具 【免费下载链接】Huawei-TCX-Converter A makeshift python tool that generates TCX files from Huawei HiTrack files 项目地址: https://gitcode.com/gh_mirrors/hu/Huawei-TCX-Converter 华为TCX转换器是一…

2026/8/2 10:53:51 阅读更多 →
解码生命暗物质:从无序蛋白到人类IDRome的分子语法与实战分析

解码生命暗物质:从无序蛋白到人类IDRome的分子语法与实战分析

1. 项目概述:从“垃圾”到“宝藏”的认知革命如果你在几年前问我,细胞内那些结构松散、像一团乱麻的蛋白质片段有什么用,我大概率会耸耸肩,把它们归为“分子垃圾”或“进化残留物”。这几乎是当时整个领域的共识。然而&#xff0c…

2026/8/2 10:53:51 阅读更多 →
Lua字节码逆向工程实战:LuaDec51反编译原理与深度应用指南

Lua字节码逆向工程实战:LuaDec51反编译原理与深度应用指南

1. 项目概述:为什么我们需要深入Lua字节码的腹地?如果你接触过游戏开发、嵌入式脚本或是某些自动化工具,那么Lua这个名字对你来说一定不陌生。这门小巧、高效、易于嵌入的脚本语言,凭借其简洁的语法和强大的扩展能力,在…

2026/8/2 10:52:51 阅读更多 →

日新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

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

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

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

2026/8/2 0:00:38 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

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

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

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

2026/8/2 0:00:38 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/2 6:34:16 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/2 2:47:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/2 0:23:22 阅读更多 →