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=4123
Description
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
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
HINT
题意
一个城镇有N个住户,N-1条路连接两个住户,保证N个住户联通,M次询问,给定N条边的信息,包括连
接的住户序号以及路的长度。然后是M次询问,每次询问Q,要求找到最长的连续序号,使得Max(dis[i]) - Min(dis[i]) ≤
Q(l≤i≤r),输出最大的r-l+1。dis[i]为从第i个住户出发,不重复走过路能移动的最远距离。
题解:
dis[i]一定是点到直径的某个点的距离,所以我们两次dfs求出直径,然后两次dfs求出距离就好了
至于第二问,对于每个询问,我们可以O(N)扫一遍就好了
代码
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<vector>
using namespace std; vector<pair<int,int> > Q[];
int d[];
int n,m;
int left1,l_num;
int Right,r_num;
int dpMax[][], dpMin[][];
void dfs1(int x,int pre,int len,int type)
{
if(type == && l_num < len)
{
l_num = len;
left1 = x;
}
if(type == && r_num < len)
{
r_num = len;
Right = x;
}
for(int i=;i<Q[x].size();i++)
{
pair<int,int> K = Q[x][i];
if(K.first == pre)continue;
dfs1(K.first,x,len + K.second,type);
}
}
void dfs2(int x,int pre,int len)
{
d[x]=max(d[x],len);
for(int i=;i<Q[x].size();i++)
{
pair<int,int> K = Q[x][i];
if(K.first == pre)continue;
dfs2(K.first,x,len + K.second);
}
}
void rmq_init() {
for (int i = ; i <= n; i++)
dpMax[i][] = dpMin[i][] = d[i]; for (int k = ; (<<k) <= n; k++) {
for (int i = ; i + (<<k) - <= n; i++) {
dpMax[i][k] = max(dpMax[i][k-], dpMax[i+(<<(k-))][k-]);
dpMin[i][k] = min(dpMin[i][k-], dpMin[i+(<<(k-))][k-]);
}
}
} int rmq_query(int l, int r) {
int k = ;
while ((<<(k+)) <= r - l + ) k++;
return max(dpMax[l][k], dpMax[r-(<<k)+][k]) - min(dpMin[l][k], dpMin[r-(<<k)+][k]);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==&&m==)break;
memset(d,,sizeof(d));
memset(dpMax,,sizeof(dpMax));
memset(dpMin,,sizeof(dpMin));
for(int i=;i<=n;i++)
Q[i].clear();
for(int i=;i<n;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
Q[x].push_back(make_pair(y,z));
Q[y].push_back(make_pair(x,z));
}
left1 = l_num = Right = r_num = ; dfs1(,-,,);
dfs1(left1,-,,);
dfs2(left1,-,);
dfs2(Right,-,);
rmq_init();
while (m--) {
int ans = , mv = ;
int QQ;
scanf("%d", &QQ);
for (int i = ; i <= n; i++) {
while (mv <= i && rmq_query(mv , i) > QQ) mv++;
ans = max(ans, i - mv + );
}
printf("%d\n", ans);
} }
}
HDU 4123 Bob’s Race 树的直径 RMQ的更多相关文章
- 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 树的直径+单调队列
题意: 给定n个点的带边权树Q个询问. 以下n-1行给出树 以下Q行每行一个数字表示询问. 首先求出dp[N] :dp[i]表示i点距离树上最远点的距离 询问u, 表示求出 dp 数组中最长的连续序列 ...
- 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:树的直径 + 单调队列 + st表
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123 题意: 给你一棵树,n个节点,每条边有长度. 然后有m个询问,每个询问给定一个q值. 设dis[ ...
- 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 (dfs树上最远距离+RMQ)
C - Bob’s Race Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Subm ...
- 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(RMQ)
题意是说给出一棵树,N(10^5)个顶点,以及每条边的权值,现在需要选择连续的K个点(顶点编号连续),可以被选出来的条件是: 若d[i]代表顶点i到树上其他点的距离的最大值,使得区间[a, b]的d值 ...
- hdu 4607 Park Visit 求树的直径
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n) ...
随机推荐
- 确实是非常实用的Ubuntu命令
1 文件管理 # ls ls -a 列出当前目录下的所有文件,包括以.头的隐含文件 文件管理 # ls ls-l或ll 列出当前目录下文件的详细信息 文件管理 # pwd pwd查看当前所在目录的绝对 ...
- 让Apache支持ASP.NET
Apache是目前广泛使用的一种网络服务器程序,不仅在UNIX/LINUX平台上被大量使用,而且在Windows平台上也有许多站点放弃了IIS 而转向Apache..NET是微软推出的功能强大的开发技 ...
- aspx与ascx,ashx的用法详细的总结介绍
这篇文章主要是对aspx与ascx,ashx的用法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 做asp.net开发的对.aspx,.ascx和.ashx都不会陌生.关于它们,网 ...
- Claim-based-security for ASP.NET Web APIs using DotNetOpenAuth
Recently I worked with a customer assisting them in implementing their Web APIs using the new ASP.NE ...
- Chapter5:语句
表达式语句:一个表达式+一个分号 表达式语句的作用是执行表达式并丢弃掉求值结果. 空语句:单独一个分号 Best Practice:使用空语句时应该加上注释,从而令读这段代码的人知道该语句是有意省略的 ...
- Tkinter教程之Text篇(3)
本文转载自:http://blog.csdn.net/jcodeer/article/details/1811348 '''Tkinter教程之Text篇(3)''''''14.自定义tag的两个内置 ...
- VS20xx下项目开发目录管理方法
在VS20XX之后项目管理使用解决方案(solution)管理一个大的开发工程中多个项目(Project). 以下目录配置与工程名称无关,适用于一般的工程组织过程. 对于一般的生成可执行程序的工程,使 ...
- GridView控件 Reapter控件 DataList控件 的区别和用法
ASP.NET三大控件: 1.GridView控件:表格视图控件,可以用来绑定结果集或者视图,用起来比较方便和灵活,三个控件中使用最多的控件 用法--- this.gridview1.DataSour ...
- 第二百九十七天 how can I 坚持
算是在家宅了一天吧,下午睡了会觉,晚上一起做了个饭,中午一起吃的炒菜和徐斌他同学. 还是那么冷啊. 整天都是东扯西扯的. 睡觉. 忘了件重要的事,就是今天第一次喝鸡尾酒,还有,常人之所以是常人,不是因 ...
- javaScript 类型判断
直接上例子: 1 判断是否为数组类型 2 判断是否为字符串类型 3 判断是否为数值类型 4 判断是否为日期类型 5 判断是否为函数 6 判断是否为对象 1 判断是否为数组类型 linenum < ...