HDU 5593 ZYB's Tree 树形dp
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5593
题意:
http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=654&pid=1004
题解:
先自底向上跑一遍,求出以u为根的子树中与u距离小于等于k的节点数(不同的距离要分开存,否则无法递推上去,dp[u][i]存距离为i的节点数)
求好之后,再dfs一遍,这次换做自顶向下,目的是求u的兄弟(和兄弟的后代)以及u的祖先(和祖先的后代,不包括以u为根的子树)中与u距离小于等于k的节点数(也是分开存)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int maxn=5e5+;
typedef long long LL; int dp[maxn][];
int fa[maxn];
int N,K,A,B; struct Edge{
int v,ne;
Edge(int v,int ne):v(v),ne(ne){}
Edge(){}
}egs[maxn*]; int head[maxn],tot; void addEdge(int u,int v){
egs[tot]=Edge(v,head[u]);
head[u]=tot++;
}
//从下往上跑一遍
void dfs1(int u){
int p=head[u];
while(p!=-){
Edge& e=egs[p];
dfs1(e.v);
for(int i=;i<=K;i++){
//转移方程1:
dp[u][i]+=dp[e.v][i-];
}
p=e.ne;
}
dp[u][]=;
}
//从上往下跑一遍
void dfs2(int u){
if(fa[u]){
for(int i=K;i>=;i--){
//转移方程2:
dp[u][i]+=dp[fa[u]][i-]-dp[u][i-];//dp[fa[u]][i-1]有包括u本身,所以要扣掉u的那部分对fa[u]的贡献
}
dp[u][]++;
}
int p=head[u];
while(p!=-){
Edge& e=egs[p];
dfs2(e.v);
p=e.ne;
}
} void init(){
fa[]=;
memset(dp,,sizeof(dp));
memset(head,-,sizeof(head));
tot=;
} int main(){
int tc;
scanf("%d",&tc);
while(tc--){
scanf("%d%d%d%d",&N,&K,&A,&B);
init();
for(int i=;i<=N;i++){
int x=((LL)A*i+B)%(i-)+;
addEdge(x,i);
fa[i]=x;
}
dfs1();
dfs2();
LL ans=;
for(int i=;i<=N;i++){
int cnt=;
for(int j=;j<=K;j++) cnt+=dp[i][j];
ans^=cnt;
}
printf("%lld\n",ans);
}
return ;
}
HDU 5593 ZYB's Tree 树形dp的更多相关文章
- Bestcoder round #65 && hdu 5593 ZYB's Tree 树形dp
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...
- HDU5593 ZYB's Tree 树形DP +分治
感觉其实就是树分治,一次BC的题,感觉这次题目质量比较高,仅代表蒟蒻的看法 一次DFS获取每个点到子树的距离不大于K的点的个数, 然后一遍BFS获取从每个点父亲不大于K的的个数,层层扩展,还是想说 其 ...
- hdu5593/ZYB's Tree 树形dp
ZYB's Tree Memory Limit: 131072/131072 K (Java/Others) 问题描述 ZYBZYB有一颗NN个节点的树,现在他希望你对于每一个点,求出离每个点距 ...
- hdu 4514 并查集+树形dp
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- 熟练剖分(tree) 树形DP
熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...
- HUD 5593——ZYB's Tree——————【树形dp】
ZYB's Tree Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tota ...
- hdu 4003 Find Metal Mineral 树形DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 Humans have discovered a kind of new metal miner ...
- hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。
/** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定 ...
- hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)
题目链接: Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: ...
随机推荐
- POJ C++程序设计 编程题#1 大整数的加减乘除
编程题#4:大整数的加减乘除 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 ...
- C#关于一个程序,只可以有一种实例的方法
方法一:使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例.把program.cs文件里的Main()函数改为如下代码: 说明:程序中通过语句 System.Threading.Mutex ru ...
- sqoop的codegen工具
一.codegen工具的使用 sqoop codegen --connect jdbc:mysql://localhost:3306/test --username root --password 1 ...
- MongoDb 2.4 beta新特性——全文索引
期待已久的特性,但目前仍然在beta阶段,所以官方建议不要在生产环境使用.也因此需要手动打开这个特性. 在命令行指定 mongod --setParameter textSearchEnabled=t ...
- win php nginx 配置小细节
win下配置php Nginx 首先 下载 php-Windows版本.下载Nginx Windows 版本 1> php.ini-production 修改为 php.ini 让其成为php的 ...
- 【FitNess】测试框架试用
参考网友的博客http://blog.csdn.net/funi16/article/details/8985280 1.官网下载jar包fitnesse-standalone.jar后安装. 2.进 ...
- 15)Java &和&&
&,双目运算符:将两个表达式的值按二进制位展开,对应的位(bit)按值进行"与"运算,结果保留在该位上- 比如170&204对应二进制就是 1010101 ...
- NuGet 的使用
install-package entityframework//Enable-Migrations -ContextTypeName College.Models.CollegeEntities ...
- 小课堂week14 Google软件测试之道
读<Google软件测试之道> 在IT领域,Google是一面旗帜,是一家非常善于思考善于尝试的公司.随着面临挑战的不断增大,传统的测试开展方式也越来越力不从心,这本书讲述的就是一次完整的 ...
- 利用MVC编程模式-开发一个简易记事本app
学了极客学院一个开发记事本的课程,利用自己对MVC编程模式的简单理解重写了一遍该app. github地址:https://github.com/morningsky/MyNote MVC即,模型(m ...