博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
集合并卷积
阅读量:4879 次
发布时间:2019-06-11

本文共 1691 字,大约阅读时间需要 5 分钟。

因为小星星那题才知道有这么个东西。。

下面这段从uoj复制的:

题目

给出f[0..(2n)1],g[0..(2n)1]f[0..(2n)−1],g[0..(2n)−1],求h[0(2n)1]h[0…(2n)−1],满足h[x]=sigma{f[i]*g[j],1<=i<=n,1<=j<=n,i|j==x}

我们记F[i]=sigma(f[j],j&i==j),G[i]=sigma{g[j],j&i==j},H[i]=F[i]*G[i],那么H[i]=sigma{h[j],i&j==j}, 通过枚举子集的子集可以O(3^n)得到H[]数组,通过枚举子集的子集可以O(3^n)用H[]数组容斥出h[]数组,求 h[i]的时候,枚举i的所有子集,如果子集j的元素个数和i相差偶数个那么H[j]对h[i]的贡献是正的,如果子集j的元素和i相差奇数个那么H[j]对h[i]的贡献是负的.

也就是说: h[i]=sigma{H[j]*(-1)^(cnt1(i-j)),j&i==j},cnt1(x)表示x的二进制表示中1的个数

接下来我们把O(3^n)的容斥算法优化到O(n*2^n).

考虑第一步预处理,我们需要求出F[x]=sigma(f[i],i&x==i)(G数组的处理和F数组相同) 如果我们求出了1到x-1的F值,并不能利用前面这些项较快地计算出F[x]。

不妨考虑x的最高位2^i,我们把x的子集分成两部分,一部分包含元素i,一部分不包含元素i,不包含元素i的部分就是F[x-(2^i)],关键是包含i的部分.我们无法从F[1],F[2],…一直顺序推到F[2^n-1]

我们记F[j][i]为只允许最后j位和i不同的i的所有子集的和,那么边界是F[0][i]=f[i] F[j][i]=F[j-1][i](i的第j位为0) =F[j-1][i]+F[j-1][] 前一维可以直接滚掉,那么我们就用O(n*2^n)的时间解决了F数组和G数组

(其实是一个n维前缀和?这个技巧是以前别人讲课的时候看见的) 接下来考虑H数组.我们发现从H数组求h数组相当于从F数组求f数组,我们把之前的DP过程倒过来就可以了…就是加号改成减号…因为每个二进制位本质一样所以从高位向低位枚举还是从低位向高位枚举都一样.

这个地方也可以理解为,h[j][i]为只允许最后j位和i不同的i的所有子集对i的贡献之和,

边界是 h[0][i]=f[i]h[0][i]=f[i]

h[j][i]=h[j1][i](ij0)h[j][i]=h[j−1][i](i的第j位为0)

h[j][i]=h[j1][i]h[j1][i(2j)](ij1)h[j][i]=h[j−1][i]−h[j−1][i−(2j)](i的第j位为1) 可以理解为每增加一个二进制位会使贡献的正负号改变一次所以把加号变成减号.

总体上感觉和斯坦纳树有点像加上了一点dp的技巧。。再加上一点容斥

代码:

 

#include 
using namespace std;int n,m,lim,f[10000],g[10000],h[100000];int main(){ freopen("noip.in","r",stdin); freopen("noip.out","w",stdout); cin>>n; lim=1<
>f[i]; for (int i=1;i<=lim-1;i++) cin>>g[i]; for (int i=0;i
>i)&1) f[j]+=f[j^(1<
>i)&1) g[j]+=g[j^(1<
>i)&1) h[j]-=h[j^(1<

 

 

转载于:https://www.cnblogs.com/yinwuxiao/p/8471250.html

你可能感兴趣的文章
关于VS项目平台的x86,x64,Any CPU以及Debug和Release的区别
查看>>
解密module_init幕后的故事
查看>>
9个移动网站优化的最佳实践
查看>>
李昌镐:苍老的青春(转载) 韩国围棋职业棋手
查看>>
JPA 使用报Named query not found错误
查看>>
FTP命令使用详解
查看>>
walmart weekly sales
查看>>
面试题07_用两个栈实现队列——剑指offer系列
查看>>
cocos2d-x3.2中加入Android手机震动
查看>>
css3处理sprite背景图压缩来解决H5网页在手机浏览器下图标模糊的问题
查看>>
温故而知新练习3
查看>>
【转】iOS应用崩溃日志分析
查看>>
EtherCAT Slave 入门教程 - 邮箱服务(1)
查看>>
java基础------抽象类
查看>>
【poj3537】 Crosses ans Crosses
查看>>
【poj1013】 Counterfeit Dollar
查看>>
Centos7 安装配置Apache+Mysql5.7+PHP7.0+phpmyadmin
查看>>
最佳调度问题
查看>>
10.04 FZSZ模拟Day1 总结
查看>>
RabbitMQ学习以及与Spring的集成(二)
查看>>