题目链接

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. 了解 Spring Boot AutoConfiguration

    原文:http://sivalabs.in/2016/03/how-springboot-autoconfiguration-magic/ 作者:Siva 译者:http://oopsguy.com ...

  2. java面向对象理解

    面向对象:世间一切事物均可认为是对象,用户不必了解软件内部的实现机制,可根据需要直接调用接口,生成一个正常工作的应用程序. 面向对象的特点:抽象,封装,继承,多态性, 对象:对象就是一个具有明确行为的 ...

  3. Intellij Idea 13 快捷键(与Eclipse比对)以及基本的设置

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt404 刚到新公司,用的台式机配置不给力,Eclipse很不给力,几个项目一起 ...

  4. 开源项目Druid的提取SQL模板

    在数据库审计中,常常用到SQL模板,这样提取一次模板,下一次就不用对相同的模板的SQL进行相关操作.对此Druid提供相应的工具类进行SQL模板提取: package com.dbappsecurit ...

  5. html加载和解析流程

    之前查找资料了解了html的整个渲染过程,对于理解页面加载帮助还是蛮大的,下面我用visio把它画成流程图,便于直观理解 好吧,居然要150字才能发布............ 浏览器渲染过程 浏览器渲 ...

  6. Cetnos搭建vsftp服务器

    1.首先yum安装vsftp server   以3.0.2为例 命令:yum -y install vsftpd 2.配置文件  vsftp.conf 具体配置内容如下: anonymous_ena ...

  7. 201521123005 《java程序设计》 第七周学习总结

    1. 本周学习总结 参考资料: XMind 2. 书面作业 Q1ArrayList代码分析 1.1 解释ArrayList的contains源代码 ArrayList的contains源代码 /** ...

  8. 201521123088《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  9. Java课程设计-定时器(团队)

    一.团队介绍(没头脑和不高兴) 陈文俊[组长] 201521123047 网络1512 宣委 郑子熙 201521123045 网络1512 二.项目Git链接 定时器 三.项目git提交记录截图 四 ...

  10. mysql:视图,触发器,事务,存储过程,函数

    一.视图 视图是一个虚拟表并不是(正实存在的) 创建老师表 create table teacher( id int primary key auto_increment, tname varchar ...