题目链接

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. 使用 qemu 搭建内核开发环境

    本文主要介绍在 MacOS 上使用 qemu 搭建 Linux Kernel 的开发环境.(在开始之前需要注意的是,本文中的 Linux 开发环境是一个远程服务器,而 qemu 被安装在本地的 Mac ...

  2. BackgroundWorker类中主要属性、方法和事件

    属性: 1.CancellationPending             获取一个值,指示应用程序是否已请求取消后台操作.通过在DoWork事件中判断CancellationPending属性可以认 ...

  3. Nginx + Memcached 实现Session共享的负载均衡

    session共享 我们在做站点的试试,通常需要保存用户的一些基本信息,比如登录就会用到Session:当使用Nginx做负载均衡的时候,用户浏览站点的时候会被分配到不同的服务器上,此时如果登录后Se ...

  4. spring boot / cloud (十六) 分布式ID生成服务

    spring boot / cloud (十六) 分布式ID生成服务 在几乎所有的分布式系统或者采用了分库/分表设计的系统中,几乎都会需要生成数据的唯一标识ID的需求, 常规做法,是使用数据库中的自动 ...

  5. 汇编指令-位置无关码(BL)与绝对位置码(LDR)(2)

    位置无关码,即该段代码无论放在内存的哪个地址,都能正确运行.究其原因,是因为代码里没有使用绝对地址,都是相对地址.  位置相关码,即它的地址与代码处于的位置相关,是绝对地址 BL :带链接分支跳转指令 ...

  6. 通信原理课程设计Javaswing技术计算出PCM编码——猎八哥FLY

    package keshe; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; ...

  7. 通过修改my.ini配置文件来解决MySQL 5.6 内存占用过高的问题

    打开后台进程发现mysql占用的内存达到400+M. 修改一下my.ini这个配置文件的配置选项是可以限制MySQL5.6内存占用过高这一问题的,具体修改选项如下: performance_schem ...

  8. 201521123022 《Java程序设计》 第五周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过? ...

  9. 201521123076 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...

  10. 《JAVA程序设计》第12周学习总结

    1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. InputStream和OutputStream为所有字节流的父类 通过操作流中的字节可处理各种不同类型的数据 ...