Maximum And Queries (hard version)

首先来介绍一下SOS DP

看这篇文章

解释一下,最开始的初始化for(int i=0;i<(1<<N);i++) f[i]=w[i];就是0/1背包的的初始化,可以模拟一下想一下为啥(其实把i当做阶段去理解就好了)

然后是DP的过程中,注意f[st^(1<<i)]是肯定不会在这一层被更新的(因为(st^(1<<i))&(1<<i)肯定为0),所以倒序循环还是正序循环是无所谓的

然后来看看超集求和

所谓S的超集,指的是所有满足以下条件的集合T,其中ST的子集(就是相当于S1不变,然后0随意变化所能够得到的集合)

那么利用相同的思想,我们可以设dp(S,i)表示S的前i位其中的0随意变化能够得到的超集和,于是有

然后再来看看这道题目

看这篇文章

解释一下

相当于我现在后面较低的19位全是0了,我肯定要均匀地给每个数加一,于是有cn

代码就看CF上的提交吧,代码的fg是基于这篇题解,比如f[p][i]指的是满足第p位为0i的超集和,至于为什么要求这两个量,见第一篇题解

posted @   最爱丁珰  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示