hdu 5909 Tree Cutting

题意:一颗无根树,每个点有权值,连通子树的权值为异或和,求异或和为[0,m)的方案数


\(f[i][j]\)表示子树i中经过i的连通子树异或和为j的方案数

转移类似背包,可以用fwt加速

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = (1<<10) + 5, P = 1e9+7, inv2 = (P+1)/2;
inline int read() {
char c=getchar(); int x=0,f=1;
while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
return x*f;
} int n, m, val[N];
struct edge{int v, ne;} e[N<<1];
int cnt, h[N];
inline void ins(int u, int v) {
e[++cnt] = (edge){v, h[u]}; h[u] = cnt;
e[++cnt] = (edge){u, h[v]}; h[v] = cnt;
}
int f[N][N], ans[N]; void fwt(int *a, int n, int flag) {
for(int l=2; l<=n; l<<=1) {
int m = l>>1;
for(int *p = a; p != a+n; p += l)
for(int k=0; k<m; k++) {
int x = p[k], y = p[k+m];
if(flag == 1) p[k] = (x + y) %P, p[k+m] = (x - y + P) %P;
else p[k] = (ll) (x + y) * inv2 %P, p[k+m] = (ll) (x - y + P) * inv2 %P;
}
}
} int t[N];
void dp(int u, int fa) {
int *a = f[u]; a[val[u]] = 1; //fwt(a, m, 1);
for(int i=h[u];i;i=e[i].ne) {
int v = e[i].v;
if(v == fa) continue;
dp(v, u); int *b = f[v];
for(int i=0; i<m; i++) t[i] = a[i];
fwt(t, m, 1); fwt(b, m, 1);
for(int i=0; i<m; i++) t[i] = (ll) t[i] * b[i] %P;
fwt(t, m, -1);
for(int i=0; i<m; i++) a[i] = (a[i] + t[i]) %P;
}
for(int i=0; i<m; i++) ans[i] = (ans[i] + a[i]) %P;
} int main() {
freopen("in", "r", stdin);
int T = read();
while(T--) {
n = read(); m = read();
for(int i=1; i<=n; i++) val[i] = read();
cnt = 0; memset(h, 0, sizeof(h));
for(int i=1; i<n; i++) ins(read(), read());
memset(f, 0, sizeof(f)); memset(ans, 0, sizeof(ans));
dp(1, 0);
for(int i=0; i<m; i++) printf("%d%c", ans[i], i==m-1 ? '\n' : ' ');
}
}

hdu 5909 Tree Cutting [树形DP fwt]的更多相关文章

  1. HDU - 5909 Tree Cutting (树形dp+FWT优化)

    题意:树上每个节点有权值,定义一棵树的权值为所有节点权值异或的值.求一棵树中,连通子树值为[0,m)的个数. 分析: 设\(dp[i][j]\)为根为i,值为j的子树的个数. 则\(dp[i][j\o ...

  2. HDU.5909.Tree Cutting(树形DP FWT/点分治)

    题目链接 \(Description\) 给定一棵树,每个点有权值,在\([0,m-1]\)之间.求异或和为\(0,1,...,m-1\)的非空连通块各有多少个. \(n\leq 1000,m\leq ...

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

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

  4. HDU 5909 Tree Cutting 动态规划 快速沃尔什变换

    Tree Cutting 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5909 Description Byteasar has a tree T ...

  5. POJ 2378.Tree Cutting 树形dp 树的重心

    Tree Cutting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4834   Accepted: 2958 Desc ...

  6. [poj3107/poj2378]Godfather/Tree Cutting树形dp

    题意:求树的重心(删除该点后子树最大的最小) 解题关键:想树的结构,删去某个点后只剩下它的子树和原树-此树所形成的数,然后第一次dp求每个子树的节点个数,第二次dp求解答案即可. 此题一开始一直T,后 ...

  7. HDU 5909 Tree Cutting(FWT+树形DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5909 [题目大意] 给出一棵树,其每棵连通子树的价值为其点权的xor和, 问有多少连通子树的价值为 ...

  8. poj 2378 Tree Cutting 树形dp

    After Farmer John realized that Bessie had installed a "tree-shaped" network among his N ( ...

  9. hdu 5909 Tree Cutting —— 点分治

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5909 点分治,每次的 rt 是必选的点: 考虑必须选根的一个连通块,可以DP,决策就是在每个子树中决定选不 ...

随机推荐

  1. UVa 12186 树形dp

    题意  分析   白皮书 P282  例题9-12 AC代码 #include <stdio.h> #include <math.h> #include <string. ...

  2. HDU_5523Game

    Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Sub ...

  3. CentOS 6.5 搭建 Zabbix

    CentOS 6.5 搭建 Zabbix 说明: 操作系统:CentOS 6.5 IP地址:192.168.21.127 Web环境:Nginx+MySQL+PHP zabbix版本:Zabbix 2 ...

  4. 一 : springmvc常用注解

    springmvc常用注解详解1.@Controller在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层 ...

  5. [国嵌笔记][017][Makefile工程管理]

    Makefile的用途 1.make能够使整个程序的编译.链接只需一个命令就可以完成 2.make的工作主要依赖于Makefile的文件.Makefile文件描述了整个程序的编译.链接等规则,使之自动 ...

  6. [学习OpenCV攻略][009][从摄像机读入数据]

    cvCreateCameraCapture(设备ID) 创建一个摄像机视频,返回值是CvCapture*类型.设备ID表示设备的编号,如果有多个摄像机设备,-1表示随机选择一个设备. #include ...

  7. Actor-ES框架:Ray

    并发 1. 并发和并行 并发:两个或多个任务在同一时间段内运行.关注点在任务分割. 并行:两个或多个任务在同一时刻同时运行.关注点在同时执行. 本文大多数情况下不会严格区分这两个概念,默认并发就是指并 ...

  8. Oracle_事务

    Oracle_事务 -事物管理   create table account(        id number,        money number );     --实现转账操作 update ...

  9. WEB应用:预览

    主题 建立WEB应用通用目录 配置classpath 将WEB应用注册到服务器中 使用制定url前缀调用WEB应用的servlet.html.jsp 为所有自己编写的servlet制定url 建立WE ...

  10. Intellij idea 导入 jdbc

    第一步,去官网https://dev.mysql.com/downloads/connector/j/ 下载驱动程序 第二步,解压压缩包,记住路径 第三步,打开你的idea工程,打开Project S ...