HDU 5909 Tree Cutting(FWT+树形DP)
2017-08-16 14:51
417 查看
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5909
【题目大意】
给出一棵树,其每棵连通子树的价值为其点权的xor和,
问有多少连通子树的价值为1~m
【题解】
首先定1为根,转有根树,我们在树的每个节点保存一个权值数组,
表示与其连通的子树的权值,当一个子树并入其父节点时,
dp[x][i]=dp[x][i]+dp[x][j]*dp[y][k](j^k==i),我们发现这是一个位运算卷积式子,
所以树上转移可以用fwt加速。
【代码】
【题目大意】
给出一棵树,其每棵连通子树的价值为其点权的xor和,
问有多少连通子树的价值为1~m
【题解】
首先定1为根,转有根树,我们在树的每个节点保存一个权值数组,
表示与其连通的子树的权值,当一个子树并入其父节点时,
dp[x][i]=dp[x][i]+dp[x][j]*dp[y][k](j^k==i),我们发现这是一个位运算卷积式子,
所以树上转移可以用fwt加速。
【代码】
#include <cstdio> #include <algorithm> #include <vector> #include <cstring> using namespace std; typedef long long LL; const int N=1030; const LL mod=1e9+7; const LL inv2=(mod+1)/2; int val ; LL dp ,tmp ; vector<int> v ; void FWT(LL*a,int n){ for(int d=1;d<n;d<<=1)for(int m=d<<1,i=0;i<n;i+=m)for(int j=0;j<d;j++){ LL x=a[i+j],y=a[i+j+d]; a[i+j]=(x+y)%mod,a[i+j+d]=(x-y+mod)%mod; } } void UFWT(LL*a,int n){ for(int d=1;d<n;d<<=1)for(int m=d<<1,i=0;i<n;i+=m)for(int j=0;j<d;j++){ LL x=a[i+j],y=a[i+j+d]; a[i+j]=(x+y)%mod*inv2%mod,a[i+j+d]=(x-y+mod)%mod*inv2%mod; } } int T,n,m,x,y; LL ans ; void Cal(LL *a,LL *b){ for(int i=0;i<m;i++)tmp[i]=a[i]; FWT(a,m); FWT(b,m); for(int i=0;i<m;i++)a[i]=(1ll*a[i]*b[i])%mod; UFWT(a,m); UFWT(b,m); for(int i=0;i<m;i++)a[i]=(a[i]+tmp[i])%mod; } void DP(int x,int fx){ dp[x][val[x]]=1; for(auto y:v[x]){ if(y==fx)continue; DP(y,x); Cal(dp[x],dp[y]); } } int main(){ scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); for(int i=0;i<=n;i++)v[i].clear(); for(int i=1;i<=n;i++)scanf("%d",&val[i]); for(int i=1;i<n;i++){ scanf("%d%d",&x,&y); v[x].push_back(y); v[y].push_back(x); }memset(dp,0,sizeof(dp)); memset(ans,0,sizeof(ans)); DP(1,1); for(int i=0;i<m;i++){ for(int j=1;j<=n;j++)ans[i]=(ans[i]+dp[j][i])%mod; }for(int i=0;i<m;i++)printf(i<m-1?"%d ":"%d\n",ans[i]); }return 0; }
相关文章推荐
- HDU 5909 Tree Cutting (点分治+树形DP|FWT+树形DP)
- HDU - 5909 Tree Cutting 树形DP+fwt优化 或点分治(待补)
- HDU 5909 Tree Cutting [树形dp+FWT]【动态规划+数学】
- HDU 5909 Tree Cutting(树形DP+FWT)
- HDU 5909 Tree Cutting (树形dp+FWT)
- HDU - 5909 Tree Cutting 树形dp + fwt 优化异或卷积和
- [树形DP] [FWT] [HDU5909] Tree Cutting
- [树形DP FWT] HDU 5909 Tree Cutting
- Hdu 5909 Tree Cutting(fwt优化异或卷积)
- 【HDU 5909】 Tree Cutting (树形依赖型DP+点分治)
- HDU 5909 Tree Cutting 树形DP+快速沃尔什变换
- hdu 5909 Tree Cutting [树形DP fwt]
- HDU 5378 树形dp转化为线性 计数转化为概率
- HDU 4705 Y (树形DP)
- hdu 4003(树形dp)
- HDU 4123 Bob’s Race(树形DP + 单调队列)
- hdu1520Anniversary party 树形dp水题
- HDU 4126 Genghis Khan the Conqueror MST+树形dp
- hdu 1520 (树形)dp
- hdu 1054(简单的树形dp)