题目链接

Problem Description
Bob wants to hold a race to encourage people to do sports. He has got trouble in choosing the route. There are N houses and N - 1 roads in his village. Each road connects two houses, and all houses are connected together. To make the race more interesting, he requires that every participant must start from a different house and run AS FAR AS POSSIBLE without passing a road more than once. The distance difference between the one who runs the longest distance and the one who runs the shortest distance is called “race difference” by Bob. Bob does not want the “race difference”to be more than Q. The houses are numbered from 1 to N. Bob wants that the No. of all starting house must be consecutive. He is now asking you for help. He wants to know the maximum number of starting houses he can choose, by other words, the maximum number of people who can take part in his race.
 
Input
There are several test cases.
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)

 
Output
For each test case, you should output the answer in a line for each query.
 
Sample Input
5 5
1 2 3
2 3 4
4 5 3
3 4 2
1
2
3
4
5
0 0
 
Sample Output
1
3
3
3
5
 
 
题意:有一颗树有n个节点编号从1~n,这n-1条边都有一个边权表示两点之间的距离,现在要求出从每个点出发不重复经过同一条边能到达的最远距离,然后m次询问,每次输入一个Q,求从连续编号的起点出发达到最远距离之间的最大值和最小值之差小于等于Q的最大区间长?
 
思路:用前向星建树(定1号节点为根节点),一次搜索求出所有节点 以当前节点为根节点时到达子树叶子节点的最远距离和次远距离,然后再进行一次搜索求出每个节点能到达的最远距离(可能是到孩子叶子节点,也可能是经过父亲节点而来的叶子节点),最后用RMQ中的ST算法配合尺取求出满足条件的最大区间长。
 
注意:使用ST算法,查询时不要使用函数log2(x),这个很费时间,自己求就行;另外可以优化一下尺取。
 
代码如下:
#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)的更多相关文章

  1. HDU 4123 Bob’s Race 树形dp+单调队列

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 Time Limit: 5000/2000 MS (Java/Others) Memory L ...

  2. 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 ...

  3. hdu 4123 Bob’s Race (dfs树上最远距离+RMQ)

    C - Bob’s Race Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Subm ...

  4. 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 ...

  5. hdu 4123 Bob’s Race 树的直径+rmq+尺取

    Bob’s Race Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Probl ...

  6. 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 ...

  7. HDU 4123 Bob’s Race(RMQ)

    题意是说给出一棵树,N(10^5)个顶点,以及每条边的权值,现在需要选择连续的K个点(顶点编号连续),可以被选出来的条件是: 若d[i]代表顶点i到树上其他点的距离的最大值,使得区间[a, b]的d值 ...

  8. HDU 4123 Bob's Race:树的直径 + 单调队列 + st表

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123 题意: 给你一棵树,n个节点,每条边有长度. 然后有m个询问,每个询问给定一个q值. 设dis[ ...

  9. HDU 4123 Bob’s Race 树的直径+单调队列

    题意: 给定n个点的带边权树Q个询问. 以下n-1行给出树 以下Q行每行一个数字表示询问. 首先求出dp[N] :dp[i]表示i点距离树上最远点的距离 询问u, 表示求出 dp 数组中最长的连续序列 ...

随机推荐

  1. jQuery遍历-后代

    后代是子.孙.曾孙等等. 通过 jQuery,您能够向下遍历 DOM 树,以查找元素的后代. 向下遍历 DOM 树 下面是两个用于向下遍历 DOM 树的 jQuery 方法: children() f ...

  2. python学习总结(函数进阶)

    -------------------程序运行原理------------------- 1.模块的内建__name__属性,主模块其值为__main__,导入模块其值为模块名     1.创建时间, ...

  3. MySQL的JOIN(一):用法

    JOIN的含义就如英文单词"join"一样,连接两张表,大致分为内连接,外连接,右连接,左连接,自然连接.这里描述先甩出一张用烂了的图,然后插入测试数据. CREATE TABLE ...

  4. Spark Submit 脚本

    当我们需要命令行传递参数时候,将--class 写在前面,然后是jar 最后是参数 spark-submit --master yarn --num-executors 3 --executor-me ...

  5. Freemarker的使用方法

    1. Freemarker概念 1.1 什么是freemarker FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器无关,即在Web运 ...

  6. Android微信登录、分享、支付

    转载需要著名出处: http://blog.csdn.net/lowprofile_coding/article/details/78004224 之前写过微信登录分享支付第一版: http://bl ...

  7. select设置disable后ie修改默认字体颜色暂时解决

    找了很多资料,终于在科学上网后找到了一个方法,虽然暂时不知道原理,但是已经实现了功能就是好的 select[disabled='disabled']::-ms-value { color: #000; ...

  8. lua代码的加载

    lua代码的加载 Openresty是什么 OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,通过把lua嵌入到Nginx中,使得我们可以用轻巧的lua语言进行nginx的 ...

  9. Alpha 版本测试和发布说明

    Alpha版本测试报告 一bug汇总 做题时答案是错的.(已修复) 每次生成的题目一样(已经修复) 计时没有显示即倒计时,难度不同的功能没有实现(打算修复) 没有导入试卷和错题功能(不打算修复) 二. ...

  10. spring在扫描包中的注解类时出现Failed to read candidate component错误

    出现:org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate componen ...