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\),其中\(S\)\(T\)的子集(就是相当于\(S\)\(1\)不变,然后\(0\)随意变化所能够得到的集合)

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

然后再来看看这道题目

看这篇文章

解释一下

相当于我现在后面较低的\(19\)位全是\(0\)了,我肯定要均匀地给每个数加一,于是有\(\frac{c}{n}\)

代码就看CF上的提交吧,代码的\(f\)\(g\)是基于这篇题解,比如\(f[p][i]\)只的是满足第\(p\)位为\(0\)\(i\)的超集和

posted @ 2024-03-02 20:33  最爱丁珰  阅读(5)  评论(0编辑  收藏  举报