题目: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 —— 点分治的更多相关文章

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

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

  2. hdu 5909 Tree Cutting [树形DP fwt]

    hdu 5909 Tree Cutting 题意:一颗无根树,每个点有权值,连通子树的权值为异或和,求异或和为[0,m)的方案数 \(f[i][j]\)表示子树i中经过i的连通子树异或和为j的方案数 ...

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

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

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

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

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

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

  6. HDU 5909 Tree Cutting

    传送门 题意: 有一棵n个点的无根树,节点依次编号为1到n,其中节点i的权值为vi, 定义一棵树的价值为它所有点的权值的异或和. 现在对于每个[0,m)的整数k,请统计有多少T的非空连通子树的价值等于 ...

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

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

  8. 【HDU 5909】 Tree Cutting (树形依赖型DP+点分治)

    Tree Cutting Problem Description Byteasar has a tree T with n vertices conveniently labeled with 1,2 ...

  9. HDU-6881 Tree Cutting (HDU多校D10T5 点分治)

    HDU-6881 Tree Cutting 题意 \(n\) 个点的一棵树,要求删除尽量少的点,使得删点之后还是一棵树,并且直径不超过 \(k\),求删除点的数量 分析 补题之前的一些错误想法: 尝试 ...

随机推荐

  1. 九度OJ 1283:第一个只出现一次的字符 (计数)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1808 解决:997 题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符 ...

  2. VS2017生成类库选择Release失效的问题

    VS的生成可以选择Debug模式或者Release模式,但是我发现在配置里面选择Release无效. 后来发现应该 在 生成->配置管理器  里面设置.

  3. Win10 Edge浏览器 应用商店 IE浏览器 无法访问页面 0x8000FFFF 问题解决

  4. 学习Filter

    http://www.cnblogs.com/jbelial/archive/2012/07/09/2582638.html Filter 介绍: 它主要用于对用户请求进行预处理,也可以对HttpSe ...

  5. 图片加载Picasso

    https://github.com/square/picasso 基本用法 // 基本用法 // 普通加载图片 Picasso.with(PicassoActivity.this) .load(&q ...

  6. Kattis - flippingcards 【并查集】

    题意 给出 N 对 数字 然后 每次从一对中 取出一个数字 判断 能否有一种取出的方案 取出的每个数字 都是不同的 思路 将每一对数字 连上一条边 然后 最后 判断每一个连通块里面 边的个数 是否 大 ...

  7. DNS 原理入门 (转)

    DNS 是互联网核心协议之一.不管是上网浏览,还是编程开发,都需要了解一点它的知识. 本文详细介绍DNS的原理,以及如何运用工具软件观察它的运作.我的目标是,读完此文后,你就能完全理解DNS. 一.D ...

  8. .vimrc .bashrc

    怕丢了,赶快保存! .bashrc # switch caps lock with escxmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'sudo ...

  9. nginx日志配置,以及日志轮询

    一.为nginx配置错误日志 Nginx错误日志是调试nginx的重要手段,属于核心功能模块的参数(ngx_core_module)该参数名字为err_log,是放在Main区块中全局配置 err_l ...

  10. linux下扩展root分区

    1 查看当前磁盘情况 fdisk -l /dev/sda1 2048 6143 2048 83 Linux /dev/sda2 * 6144 1054719 524288 83 Linux /dev/ ...