Maximum And Queries (hard version)

首先来介绍一下SOS DP

看这篇文章

解释一下,最开始的初始化for(int i=0;i<(1<<N);i++) f[i]=w[i];就是0/1背包的的初始化,可以模拟一下想一下为啥

然后是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\)的超集和

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值