hdu 5909 Tree Cutting —— 点分治
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5909
点分治,每次的 rt 是必选的点;
考虑必须选根的一个连通块,可以DP,决策就是在每个子树中决定选不选子树根,如果不选就跳过这个子树;
于是可以转化成 dfs 序上的DP;
每次重新标记一遍 dfs 序,但不改动 siz (也许可以改动但T了?),可能因为 siz 还和点分治的过程有关。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const xn=,inf=,mod=1e9+;
int n,m,v[xn],hd[xn],ct,to[xn<<],nxt[xn<<],siz[xn],dfn[xn],g[xn],tim;
int ans[xn],f[xn][xn],rt,mx,nt[xn];
bool vis[xn];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
void upt(int &x,int y){x+=y; while(x>=mod)x-=mod; while(x<)x+=mod;}
void add(int x,int y){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct;}
void getrt(int x,int fa,int sum)
{
int nmx=; siz[x]=;
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==fa||vis[u])continue;
getrt(u,x,sum); siz[x]+=siz[u];
if(siz[u]>nmx)nmx=siz[u];
}
nmx=max(nmx,sum-siz[x]);
if(nmx<mx)mx=nmx,rt=x;
}
void dfs(int x,int fa)
{
dfn[x]=++tim; g[tim]=v[x];
for(int i=hd[x],u;i;i=nxt[i])
if((u=to[i])!=fa&&!vis[u])dfs(u,x);
nt[dfn[x]]=tim+;
}
void work(int x,int ss)
{
vis[x]=; tim=; dfs(x,);
for(int i=;i<=ss+;i++)memset(f[i],,sizeof f[i]);
f[][g[]]=;
for(int i=;i<=ss;i++)
for(int j=;j<m;j++)
if(f[i][j])upt(f[i+][j^g[i]],f[i][j]),upt(f[nt[i]][j],f[i][j]);
//printf("x=%d ss=%d\n",x,ss);
for(int j=;j<m;j++)upt(ans[j],f[ss+][j]);
//,printf("f[%d][%d]=%d\n",dfn[x]+siz[x],j,f[dfn[x]+siz[x]][j]);
for(int i=hd[x],u;i;i=nxt[i])
if(!vis[u=to[i]])
{
int ns=(siz[u]>siz[x]?ss-siz[x]:siz[u]);
mx=inf; getrt(u,,ns); work(rt,ns);
}
}
int main()
{
int T=rd();
while(T--)
{
n=rd(); m=rd();
for(int i=;i<=n;i++)v[i]=rd();
ct=; tim=;
for(int i=;i<=n;i++)hd[i]=;
for(int i=,x,y;i<n;i++)x=rd(),y=rd(),add(x,y),add(y,x);
for(int j=;j<m;j++)ans[j]=;
for(int i=;i<=n;i++)vis[i]=;
mx=inf; getrt(,,n); work(rt,n);
for(int j=;j<m;j++)printf("%d%c",ans[j],j==m-?'\n':' ');
}
return ;
}
hdu 5909 Tree Cutting —— 点分治的更多相关文章
- hdu 5909 Tree Cutting——点分治(树形DP转为序列DP)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5909 点分治的话,每次要做一次树形DP:但时间应该是 siz*m2 的.可以用 FWT 变成 siz*ml ...
- hdu 5909 Tree Cutting [树形DP fwt]
hdu 5909 Tree Cutting 题意:一颗无根树,每个点有权值,连通子树的权值为异或和,求异或和为[0,m)的方案数 \(f[i][j]\)表示子树i中经过i的连通子树异或和为j的方案数 ...
- HDU 5909 Tree Cutting 动态规划 快速沃尔什变换
Tree Cutting 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5909 Description Byteasar has a tree T ...
- HDU.5909.Tree Cutting(树形DP FWT/点分治)
题目链接 \(Description\) 给定一棵树,每个点有权值,在\([0,m-1]\)之间.求异或和为\(0,1,...,m-1\)的非空连通块各有多少个. \(n\leq 1000,m\leq ...
- HDU 5909 Tree Cutting(FWT+树形DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5909 [题目大意] 给出一棵树,其每棵连通子树的价值为其点权的xor和, 问有多少连通子树的价值为 ...
- HDU 5909 Tree Cutting
传送门 题意: 有一棵n个点的无根树,节点依次编号为1到n,其中节点i的权值为vi, 定义一棵树的价值为它所有点的权值的异或和. 现在对于每个[0,m)的整数k,请统计有多少T的非空连通子树的价值等于 ...
- HDU - 5909 Tree Cutting (树形dp+FWT优化)
题意:树上每个节点有权值,定义一棵树的权值为所有节点权值异或的值.求一棵树中,连通子树值为[0,m)的个数. 分析: 设\(dp[i][j]\)为根为i,值为j的子树的个数. 则\(dp[i][j\o ...
- 【HDU 5909】 Tree Cutting (树形依赖型DP+点分治)
Tree Cutting Problem Description Byteasar has a tree T with n vertices conveniently labeled with 1,2 ...
- HDU-6881 Tree Cutting (HDU多校D10T5 点分治)
HDU-6881 Tree Cutting 题意 \(n\) 个点的一棵树,要求删除尽量少的点,使得删点之后还是一棵树,并且直径不超过 \(k\),求删除点的数量 分析 补题之前的一些错误想法: 尝试 ...
随机推荐
- ArcGIS Scalebar 比例尺
说明.这篇博文的示例代码 地图充满body arcgis api for javascript iis怎么离线部署 请参考我前面的博文 1.运行效果 3.HTML代码 <!DOCTYPE htm ...
- 信息搜集之google语法
总结的比较全,无耻的转了.D: http://blog.csdn.net/chaosa/article/details/1828301 说起Google,可谓无人不知无人不晓.作为世界第一的搜索引擎, ...
- 九度OJ 1348:数组中的逆序对 (排序、归并排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2777 解决:656 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组 ...
- iOS 多线程(队列、任务、串行、并行、同步、异步)
- java.time.ZonedDateTime
Java的日期与时间 ZonedDateTime类是Java 8中日期时间功能里,用于表示带时区的日期与时间信息的类.可以用于表示一个真实事件的开始时间,如某火箭升空时间等等. ZonedDateTi ...
- struts2 封装获取表单数据的方式
一.属性封装 1.在action中设置成员变量,变量名与表单中的name属性值相同 2.生成变量的set方法 实例 获取用户输入的用户名和密码 jsp页面 java代码 二.模型驱动(常用) 1.ac ...
- windows下php升级到7.2
1: 官网下载:https://windows.php.net/download#php-7.2
- 3.26课·········window.document对象
1.Window.document对象 一.找到元素: docunment.getElementById("id"):根据id找,最多找一个: var a =docun ...
- 关于用JAVA开发短信方面的知识
现在流行的网络业务莫过于短信了.网易新浪等都因此而盈利,股价上涨.我凭自己的经验和公司支持,也就乘着东风来研究一下了! 首先,你要选择一台移动或者联通的短信服务器做你们的发送短信接口.这是最关键的 ...
- 每天一个Linux命令(21)find命令_xargs参数
xargs 与 exec 的作用类似,但是xargs与find 一起使用时,一般配合管道一起使用. 前面的输出转换为后方指令的参数输入,使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的 ...