【树形DP+FWT】HDU5909[Tree Cutting]题解
2018-01-15 13:25
309 查看
题目概述
定义一棵树 {vn} 的权值为 v1 xor v2 xor v3 xor⋯vn 。给出一棵树,统计权值 [0,m) 在这棵树子图(子图显然也是树)中的出现情况。解题报告
定义 f[i][j] 表示以 i 为根异或权值为 j 的方案数,对于 i 的儿子 son ,我们可以进行转移:f′[i][j]=∑k⊕t=jf[i][k]f[son][t]
显然是位运算卷积,上FWT就行了。
示例程序
#include<cstdio> #include<cstring> using namespace std; typedef long long LL; const int maxn=1000,maxm=1024,MOD=1e9+7,INV2=MOD+1>>1; int te,n,m,v[maxn+5],f[maxn+5][maxm],ans[maxm]; int E,lnk[maxn+5],nxt[(maxn<<1)+5],son[(maxn<<1)+5]; #define Add(x,y) son[++E]=(y),nxt[E]=lnk[x],lnk[x]=E inline void AMOD(int &x,int tem) {if ((x+=tem)>=MOD) x-=MOD;} inline void FWT(int *a,int n,int f){ for (int k=1;k<n;k<<=1) for (int i=0;i<n;i+=k<<1) for (int j=0;j<k;j++){ int x=a[i+j],y=a[i+j+k];AMOD(a[i+j]=x,y);AMOD(a[i+j+k]=x,MOD-y); if (f<0) a[i+j]=(LL)a[i+j]*INV2%MOD,a[i+j+k]=(LL)a[i+j+k]*INV2%MOD; } } void DP(int x,int pre=0){ int *fx=f[x];memset(f[x],0,sizeof(f[x]));fx[v[x]]=1; //这里不能写成memset(fx,0,sizeof(fx)),会出现所谓的指针降级错误 for (int j=lnk[x];j;j=nxt[j]) if (son[j]!=pre){ int tem[m];for (int i=0;i<m;i++) tem[i]=fx[i]; DP(son[j],x);int *fs=f[son[j]];FWT(tem,m,1);FWT(fs,m,1); for (int i=0;i<m;i++) tem[i]=(LL)tem[i]*fs[i]%MOD; FWT(tem,m,-1);for (int i=0;i<m;i++) AMOD(fx[i],tem[i]); } for (int i=0;i<m;i++) AMOD(ans[i],fx[i]); } int main(){ freopen("program.in","r",stdin); freopen("program.out","w",stdout); for (scanf("%d",&te);te;te--){ E=0;memset(lnk,0,sizeof(lnk));memset(ans,0,sizeof(ans)); scanf("%d%d",&n,&m);for (int i=1;i<=n;i++) scanf("%d",&v[i]); for (int i=1,x,y;i<n;i++) scanf("%d%d",&x,&y),Add(x,y),Add(y,x); DP(1);for (int i=0;i<m-1;i++) printf("%d ",ans[i]);printf("%d\n",ans[m-1]); } return 0; }
相关文章推荐
- hdu5909 Tree Cutting 【树形dp + FWT】
- [树形DP] [FWT] [HDU5909] Tree Cutting
- HDU 5909 Tree Cutting [树形dp+FWT]【动态规划+数学】
- HDU 5909 Tree Cutting (树形dp+FWT)
- HDU 5909 Tree Cutting(树形DP+FWT)
- HDU5909 Tree Cutting(树形DP + FWT)
- HDU 5977 Garden of Eden (树形dp+快速沃尔什变换FWT)
- HDU - 5909 Tree Cutting 树形dp + fwt 优化异或卷积和
- 【CF582E】Boolean Function 树形DP+FWT
- HDU 5909 Tree Cutting (点分治+树形DP|FWT+树形DP)
- HDU 5909 Tree Cutting 树形DP+快速沃尔什变换
- hdu5909:Tree Cutting (FWT/点分治优化树形DP)
- HDU - 5909 Tree Cutting 树形DP+fwt优化 或点分治(待补)
- hdu5909 Tree Cutting - FWT 加速集合异或(*)
- HDU 5909 Tree Cutting(FWT+树形DP)
- hdu5909-Tree Cutting(树形dp)
- hdu 5909 Tree Cutting [树形DP fwt]
- 【NOI2012T4】迷失游乐园-环套树+树形DP+期望DP
- Uva 10859 - Placing Lampposts 树形DP+保持一个值最优的情况下维护另一个最优值
- Codeforces 23 E Tree 树形dp+高精