题目: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 ;
}

最新文章

  1. Jungle Roads[HDU1301]
  2. 《与小卡特一起学Python》Code4 GUI easygui的使用
  3. 结构struct
  4. COGS1117
  5. Mysql之多源复制
  6. Android HandlerThread 完全解析
  7. (luogu1704)寻找最优美做题曲线 [TPLY]
  8. Linux系统把/home重新挂载到其他硬盘或分区
  9. SpringCloud的Bus(一)消息中间件的概念和用途
  10. [C++ Primer Plus] 第10章、对象和类(二)课后习题
  11. 三篇文章带你极速入门php(二)之迅速搭建php环境
  12. 一行css解决图片统一大小后的拉伸问题(被冷漠的object-fit)
  13. 小波学习之二(单层一维离散小波变换DWT的Mallat算法C++实现优化)--转载
  14. python之模块copy,了解概念即可
  15. 调研Android的开发环境的发展演变
  16. IQKeyboardManager第三方库的使用
  17. Java 字符串 String
  18. disconf实践(二)基于XML的分布式配置文件管理,不会自动reload
  19. ThinkPHP 多语言的实现
  20. 详解WordPress中简码格式标签编写的基本方法

热门文章

  1. 【HTML5开发系列】HTML元素总结
  2. 在spring boot中使用自定义的properties
  3. PHP开发环境搭建(转载)
  4. 洛谷 P3216 [HNOI2011]数学作业
  5. js与jquey的表达
  6. SAP初始账号
  7. JVM 性能优化, Part 4: C4 垃圾回收
  8. JavaScript测试代码
  9. linux awk数组相关操作介绍
  10. STM32大文件分块校验CRC