专栏文章

题解:CF2070F Friends and Pizza

CF2070F题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipyowj3
此快照首次捕获于
2025/12/03 20:06
3 个月前
此快照最后确认于
2025/12/03 20:06
3 个月前
查看原文
设第 ii 个人喜欢吃的蛋糕的 bitmask 为 s[i]s[i],设所有奇数片蛋糕的 bitmask 为 DD
那么能选 i,ji,j 两个人当且仅当 s[i]s[j]D=0s[i]\cap s[j]\cap D=0
考虑某个 bitmask kk 能被哪几对 i,ji,j 得到,即求出:
cnt[k]=1i<jm[s[i]s[j]D=0][s[i]s[j]=k]cnt[k]=\sum_{1\le i<j\le m}[s[i]\cap s[j]\cap D=0][s[i]|s[j]=k]
这是子集卷积的变形,即:
cnt[k]=1i<jm[(s[i]D)(s[j]D)=0][s[i]s[j]=k]cnt[k]=\sum_{1\le i<j\le m}[(s[i]\cap D)\cap (s[j]\cap D)=0][s[i]|s[j]=k]
考察正常的子集卷积的推导方式:
ij=kij=0i+j=iji\cup j=k\\ i\cap j=0\Rightarrow |i|+|j|=|i\cup j|
因此加上一维 popcnt,内层使用 FWT 做 or 卷积即可。
那么在这里
ij=kijD=0iD+jD=(iD)(jD)=(ij)Di\cup j=k\\ i\cap j\cap D=0\Rightarrow |i\cap D|+|j\cap D|=|(i\cap D)\cup (j\cap D)|=|(i\cup j)\cap D|
于是初始化时:
a[popcnt(iD)][i]+=1a[\operatorname{popcnt}(i\cap D)][i]+=1
在取出答案时:
ans=a[popcnt(iD)][i]ans=a[\operatorname{popcnt}(i\cap D)][i]
就做完了,注意要把 i=ji=j 的多算的部分减掉,再把答案除以二
时间复杂度 O(2n×n2+ai)O(2^n\times n^2+\sum a_i),空间复杂度 O(2n×n)O(2^n\times n)

评论

0 条评论,欢迎与作者交流。

正在加载评论...