P4221 [WC2018]州区划分
我们考虑一个 dp ,设 dp[s] 表示 s 这个集合城市得到的答案,f[s] 表示 s 集合城市的权值和(如果联通且存在欧拉路径我们视之为 0 )。
于是有:
dp[S]=1f[S]∑s⊂Sdp[s]f[S∖s]这东西形式看起来很像分治 FFT 啊(只是换成了 FWT 而已。。)。
我们考虑子集卷积最后推出的式子是:
C′x=IFMT(∑0≤i≤xFMT(A′i)⋅FMT(B′x−i))在这里,我们把 f,dp 分别扩展到二维,因为 s 不能等于 S ,所以就是:
dpx,s=∑i|j=s,p(i)+p(j)=x,p(i)≠xdpp(i),ifp(j),j写回那 FMT 形式:
dpx=IFMT(∑0≤i<xdpi×orfx−i)dpx=IFMT(∑0≤i<xFMT(dpi)⋅FMT(fx−i))所以为了算 dpx 拿前 0≤i<x 的 dp 和 f 来分别卷一下就好了。
预处理 FMT(fi) 复杂度 O(n22n)
于是算每个 FMT(dpx) 需要的仅仅是算个点积,复杂度是 O(n22n)。
然后对于每个 dpx 都需要 IFMT 回去 乘上前面那个系数 1f[S] 再做回来,复杂度还是 O(n22n) 。
于是总复杂度仍然是 O(n22n)。
不开 O2 稳 T()
cpp
1 |
|