题目链接

\(Description\)

给定一棵树,每个点有权值,在\([0,m-1]\)之间。求异或和为\(0,1,...,m-1\)的非空连通块各有多少个。
\(n\leq 1000,m\leq 2^{10}\)。

\(Solution\)

在每个连通块的根节点处统计。\(f[x][k]\)表示以\(x\)为根,异或和为\(k\)的连通块(子树)有多少个。
那么\(f[x][k]=f[x][k]+\sum_{i\ \mathbb{xor}\ j=k}f[x][i]*f[v][j],\ v=son[x]\)。
后一部分就是异或卷积,可以用\(FWT\)优化。

具体实现,不需要每次转移一棵子树都\(FWT,IFWT\)一次。中间过程一直用\(FWT\)后的\(f\)计算就可以了。
可能有的问题是,\(f\)本身(\(f[x][k]\))还要加上自己,必须在转移的时候\(IFWT\)回去?不妨在\(f[v]\)计算完之后\(IFWT(f[v])\),令\(f[v][0]++\),然后再\(FWT\)回去,用这个\(f[v]\)去更新\(f[x]\)。这样就可以直接用\(FWT\)后的\(f\)计算了。
\(f[x][0]\)在计算前是不能\(+1\)的,因为必须要求\(f[x]\)代表的非空连通块是以\(x\)为根的。
最后把所有\(f[i]\ IFWT\)回去,再令\(f[i][0]\)--。
复杂度\(O(nm\log m)\)。

所以有这两种写法的差异。。
https://www.cnblogs.com/cjyyb/p/9065611.html
https://blog.csdn.net/clover_hxy/article/details/72722352
还可以点分治。。在第二篇里有。不想写了。

//858MS 5528K(怎么那么多跑的很快的啊--点分?)
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 200000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
#define inv2 500000004
#define mod 1000000007
#define Add(x,y) (x+y>=mod?x+y-mod:x+y)
#define Sub(x,y) (x<y?x-y+mod:x-y)
typedef long long LL;
const int N=1024+5;int lim,Enum,H[N],nxt[N<<1],to[N<<1],f[1005][N];
char IN[MAXIN],*SS=IN,*TT=IN;inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}
inline void AE(int u,int v)
{to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
}
void FWT(int *a,int lim,int opt)
{for(int i=2; i<=lim; i<<=1)for(int j=0,mid=i>>1; j<lim; j+=i)for(int k=j; k<j+mid; ++k){int x=a[k], y=a[k+mid];a[k]=Add(x,y), a[k+mid]=Sub(x,y);if(opt==-1) a[k]=1ll*a[k]*inv2%mod, a[k+mid]=1ll*a[k+mid]*inv2%mod;}
}
void DFS(int x,int fa)
{FWT(f[x],lim,1);for(int i=H[x],v; i; i=nxt[i])if((v=to[i])!=fa){DFS(v,x);for(int j=0; j<lim; ++j) f[x][j]=1ll*f[x][j]*f[v][j]%mod;}FWT(f[x],lim,-1), f[x][0]=Add(f[x][0],1), FWT(f[x],lim,1);
}int main()
{static LL Ans[N];for(int T=read(); T--; ){Enum=0, memset(H,0,sizeof H);memset(f,0,sizeof f), memset(Ans,0,sizeof Ans);int n=read(),m=read(); lim=m;for(int i=1; i<=n; ++i) ++f[i][read()];for(int i=1; i<n; ++i) AE(read(),read());DFS(1,1);for(int i=1; i<=n; ++i){FWT(f[i],lim,-1), f[i][0]=Sub(f[i][0],1);for(int j=0; j<m; ++j) Ans[j]+=f[i][j];}for(int i=0; i<m; ++i) printf("%d%c",int(Ans[i]%mod)," \n"[i+1==m]);//输出格式。。}return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/10027062.html

HDU.5909.Tree Cutting(树形DP FWT/点分治)相关推荐

  1. hdu 5909 Tree Cutting——点分治(树形DP转为序列DP)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5909 点分治的话,每次要做一次树形DP:但时间应该是 siz*m2 的.可以用 FWT 变成 siz*ml ...

  2. HDU 3534 Tree (经典树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3534 题意: 给你一棵树,问你有多少对点的距离等于树的直径. 思路: dp[i][0]表示在i的子树中 ...

  3. HDU - 1520 Anniversary party [树形dp]

    Anniversary party 时限:1000ms Problem Description There is going to be a party to celebrate the 80-th ...

  4. Codeforces Round #263 (Div. 2) D. Appleman and Tree(树形DP)

    题目链接 D. Appleman and Tree time limit per test :2 seconds memory limit per test: 256 megabytes input ...

  5. 【牛客 - 303K第十五届浙江大学宁波理工学院程序设计大赛(同步赛)】Technology Tree(树形dp,tricks)

    题干: 在星际争霸(StarCraft)中,有3个种族.对于任意一个种族,他们的建筑建造都是有一个顺序的.这个顺序正好是一个树形结构,我们称之为"科技树"(Technology t ...

  6. CF1120D Power Tree(树形DP/构造+差分+最小生成树)

    解法一:树形DP 个人觉得这个方法是比较可能想到的,但是输出方案很恶心 先转换题意:"无论怎样规定叶子的初始点权,都可以通过操作你选择的点来让所有叶子的点权清空"意味着每个叶子节点 ...

  7. bzoj4987: Tree(树形dp)

    Description 从前有棵树. 找出K个点A1,A2,-,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. Input 第一行两个正整数n,k,表示数的顶点数和需要 ...

  8. Codeforces1153D-Serval and Rooted Tree(树形dp)

    原题链接:http://codeforces.com/problemset/problem/1153/D 题目原文: D. Serval and Rooted Tree time limit per ...

  9. D. Nastia Plays with a Tree(树形dp)

    https://codeforces.com/contest/1521/problem/D 思路: 把树上的单链初始时每个点是一个链.然后类似树形dp递归.递归过程中模拟链的断开,拼凑新的链头链尾. ...

最新文章

  1. PHP PSR-4 Autoloader 自动加载(中文版)
  2. 谈谈WEB开发中的苦大难字符集问题
  3. 诺贝尔奖得主Paul Krugman认可bch发展路线
  4. MSVCR80D.dll not found 问题(转)
  5. C 中的内存操作函数-memcpy 等(to be continued)
  6. 关于std:auto_ptr
  7. Apollo自动驾驶入门课程第⑥讲 — 预测
  8. cdn需要备案吗_车子贴改色膜需要到车管所备案吗?
  9. 禁用Alt + F4关闭窗体的一些常用方法
  10. pytorch .item_从数据到模型,你可能需要1篇详实的pytorch踩坑指南
  11. 颜宁谈为何选择深圳:一拍即合!我麻溜地向普林斯顿递了辞职申请
  12. pdf转word文档保留原格式 本地离线软件
  13. html图片的自动轮播js,js实现轮播图效果 纯js实现图片自动切换
  14. 2014年数学建模美赛题目原文及翻译[个人思路]
  15. websphere9静默式安装文档(简易版)
  16. 程序员无处安放的青春
  17. coreldraw x8里线段显示尺寸_CorelDRAW X8如何精确添加辅助线
  18. 如何使用JavaScript,纯前端实现字符、字数统计?
  19. 飞翔的红蜻蜓(浙理体育)——生成跑步数据并上传
  20. 计算机用户名及密码修改,电脑用户名是什么意思(怎么修改及设置用户名)

热门文章

  1. LuoguP4841 城市规划
  2. pandas 如何判断指定列是否(全部)为NaN(空值)
  3. Jira 的 数据库备份恢复 简单过程
  4. InSAR 处理软件
  5. rem和em学习笔记及CSS预处理
  6. 使用指针数组实现这两个矩阵的相乘
  7. python学习之路-继承
  8. 关于医学院网络中心成立工作室的设想
  9. apache站点优化--限速
  10. python编程狮app题库_‎Python编程狮-零基础学Python im App Store