hdu 4123--Bob’s Race(树形DP+RMQ)
The first line of each test case contains two integers N and M. N is the number of houses, M is the number of queries.
The following N-1 lines, each contains three integers, x, y and z, indicating that there is a road of length z connecting house x and house y.
The following M lines are the queries. Each line contains an integer Q, asking that at most how many people can take part in Bob’s race according to the above mentioned rules and under the condition that the“race difference”is no more than Q.
The input ends with N = 0 and M = 0.
(N<=50000 M<=500 1<=x,y<=N 0<=z<=5000 Q<=10000000)
- #include <iostream>
- #include <algorithm>
- #include <cstdio>
- #include <cstring>
- using namespace std;
- typedef long long LL;
- const int N=;
- int h[N],H[N],H2[N],ans[N],tot;
- int f1[N][],f2[N][];
- struct edge
- {
- int to;
- int next;
- int x;
- }e[*N];
- void add(int u,int v,int x)
- {
- e[tot].to=v;
- e[tot].x=x;
- e[tot].next=h[u];
- h[u]=tot++;
- e[tot].to=u;
- e[tot].x=x;
- e[tot].next=h[v];
- h[v]=tot++;
- }
- void getH(int id,int fa)
- {
- H[id]=;
- H2[id]=;
- for(int i=h[id];i!=-;i=e[i].next)
- {
- if(e[i].to==fa) continue;
- getH(e[i].to,id);
- int tmp=H[e[i].to]+e[i].x;
- if(H[id]<tmp)
- {
- H2[id]=H[id];
- H[id]=tmp;
- }
- else if(H2[id]<tmp) H2[id]=tmp;
- }
- }
- void dfs(int id,int fa,int deep)
- {
- ans[id]=max(deep,H[id]);
- for(int i=h[id];i!=-;i=e[i].next)
- {
- if(e[i].to==fa) continue;
- int tmp=deep;
- int d=H[e[i].to]+e[i].x;
- if(d==H[id]) tmp=max(tmp,H2[id]);
- else tmp=max(tmp,H[id]);
- dfs(e[i].to,id,tmp+e[i].x);
- }
- }
- void cal(int n)
- {
- for(int i=;i<=n;i++) f1[i][]=ans[i],f2[i][]=ans[i];
- int len=;
- for(int s=;len<=n;s++,len*=)
- {
- for(int i=;i+len-<=n;i++)
- {
- f1[i][s]=max(f1[i][s-],f1[i+len/][s-]);
- f2[i][s]=min(f2[i][s-],f2[i+len/][s-]);
- }
- }
- }
- int get(int i,int j)
- {
- int len=-;
- int t=j-i+;
- while(t)
- {
- len++;
- t>>=;
- }
- return max(f1[i][len],f1[j-(<<len)+][len])-min(f2[i][len],f2[j-(<<len)+][len]);
- }
- void init()
- {
- tot=;
- memset(h,-,sizeof(h));
- }
- int main()
- {
- int n,m;
- while(scanf("%d%d",&n,&m)&&(n+m))
- {
- init();
- for(int i=;i<n;i++)
- {
- int u,v,x;
- scanf("%d%d%d",&u,&v,&x);
- add(u,v,x);
- }
- getH(,-);
- dfs(,-,);
- cal(n);
- while(m--)
- {
- int Q; scanf("%d",&Q);
- int res=;
- int pos=;
- for(int i=;i<=n;i++)
- {
- if(i-pos+<=res) continue; ///优化一下;
- int tmp=get(pos,i);
- while(tmp>Q)
- {
- pos++;
- tmp=get(pos,i);
- }
- res=max(res,i-pos+);
- }
- printf("%d\n",res);
- }
- }
- return ;
- }
- /**
- 4 6
- 1 2 2
- 1 3 4
- 3 4 3
- */
- /**
- 18 7984
- 1 2 2
- 1 3 4
- 1 4 3
- 1 5 5
- 2 6 1
- 2 7 3
- 2 8 7
- 3 9 2
- 3 10 4
- 4 11 2
- 4 12 2
- 5 13 3
- 5 14 3
- 9 15 7
- 9 16 6
- 12 17 5
- 14 18 4
- */
hdu 4123--Bob’s Race(树形DP+RMQ)的更多相关文章
- HDU 4123 Bob’s Race 树形dp+单调队列
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 Time Limit: 5000/2000 MS (Java/Others) Memory L ...
- HDU 4123 Bob’s Race(树形DP,rmq)
Bob’s Race Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 4123 Bob’s Race (dfs树上最远距离+RMQ)
C - Bob’s Race Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Subm ...
- HDU 4123 Bob’s Race 树的直径 RMQ
Bob’s Race Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=41 ...
- hdu 4123 Bob’s Race 树的直径+rmq+尺取
Bob’s Race Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- HDU 4123 Bob’s Race 树的直径+ST表
Bob’s Race Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=41 ...
- HDU 4123 Bob’s Race(RMQ)
题意是说给出一棵树,N(10^5)个顶点,以及每条边的权值,现在需要选择连续的K个点(顶点编号连续),可以被选出来的条件是: 若d[i]代表顶点i到树上其他点的距离的最大值,使得区间[a, b]的d值 ...
- HDU 4123 Bob's Race:树的直径 + 单调队列 + st表
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123 题意: 给你一棵树,n个节点,每条边有长度. 然后有m个询问,每个询问给定一个q值. 设dis[ ...
- HDU 4123 Bob’s Race 树的直径+单调队列
题意: 给定n个点的带边权树Q个询问. 以下n-1行给出树 以下Q行每行一个数字表示询问. 首先求出dp[N] :dp[i]表示i点距离树上最远点的距离 询问u, 表示求出 dp 数组中最长的连续序列 ...
随机推荐
- 面试题收集---grep和find的区别
grep是通过文件找内容 find 是通过内容找文件 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来. 而linux下的find, 在目录结构 ...
- CSS照片墙
<!doctype html><html><head><meta charset="utf-8"><title>CSS照 ...
- 开源分享 Unity3d客户端与C#分布式服务端游戏框架
很久之前,在博客园写了一篇文章,<分布式网游server的一些想法语言和平台的选择>,当时就有了用C#做网游服务端的想法.写了个Unity3d客户端分布式服务端框架,最近发布了1.0版本, ...
- win10下移动硬盘位置不可用无法访问
win10下移动硬盘位置不可用无法访问 网上搜索得到的答案是: 请参考以下步骤解决: 1.按Windows+R输入"CHKDSK H: /F /R"(H:是硬盘所在盘符./R 找到 ...
- Redis单机版和集群版的安装和部署
1.单机版的安装 本次使用redis3.0版本.3.0版本主要增加了redis集群功能. 安装的前提条件: 需要安装gcc:yum install gcc-c++ 1.1 安装redis 1.下载re ...
- Arrays和Collections 对于sort的不同实现原理
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp46 1.Arrays.sort() 该算法是一个经过调优的快速排序,此算法 ...
- linq之延迟加载和即时加载+标准查询运算符
延迟加载 Linq查询的执行结果是IEnumerable<T>类型,而对IEnumerable<T>,在内部,C#通过yield关键字实现迭代器达到延迟加载的目的.从而使Lin ...
- Mac系统实现git命令自动补全
当我第一次使用mac电脑的时候,由于我是从事软件开发的程序员,所以必须经常要使用到git,然而发现在mac系统下,git不能实现命令的自动补全,然后网上查找资料,找到了解决办法,终于可以实现了git命 ...
- [2017BUAA软工助教]评论汇总
一 邹欣 周筠 飞龙 二 学校 课程 教师 助教1 助教2 助教3 福州 软件工程1715K 柯逍 谢涛 软件工程1715Z 张栋 刘乾 汪培侨 软件工程1715W 汪璟玢 曾逸群 卞倩虹 李娟 集美 ...
- Servlet的生命周期与运行原理
Servlet的生命周期: 1 加载classLoader 2 实例化 new 3 初始化 init(ServletConfig) 4 处理请求 service doGet d ...