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 数组中最长的连续序列 ...
随机推荐
- AOP入门之静态代理
代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式一般涉及 ...
- SpringMVC + Mybatis bug调试 SQL正确,查数据库却返回NULL
今天碰到个bug,有点意思 背景是SpringMVC + Mybatis的一个项目,mapper文件里写了一条sql 大概相当于 select a from tableA where b = &quo ...
- java内存管理(堆、栈、方法区)
java内存管理 简介 首先我们要了解我们为什么要学习java虚拟机的内存管理,不是java的gc垃圾回收机制都帮我们释放了内存了吗?但是在写程序的过程中却也往往因为不懂内存管理而造成了一些不容易察觉 ...
- Java企业微信开发_09_素材管理之下载微信临时素材到本地服务器
一.本节要点 1.获取临时素材接口 请求方式:GET(HTTPS) 请求地址:https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=AC ...
- 八大排序算法---基于python
本文节选自:http://python.jobbole.com/82270/ 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 ...
- 计算理论:NFA转DFA的两种方法
本文将以两种方法实现NFA转DFA,并利用C语言实现. 方法二已利用HNU OJ系统验证,方法一迷之WA,但思路应该是对的,自试方案,测试均通过. (主要是思路,AC均浮云,大概又有什么奇怪的Case ...
- DotNetCore跨平台~Quartz定时单次任务
之前写过一篇文件<DotNetCore跨平台~Quartz热部署的福音-监控文件夹的变化>,今天主要把框架优化了一下,支持外部触发,并支持外部将参数以JobDataMap形式进行输入,然后 ...
- Httpservlet 获取json对象字符窜
使用的是google 的json转换jar import com.google.gson.JsonObject;import com.google.gson.JsonParser; import or ...
- ★浅谈Spanking情节
- 团队作业8 ----第二次项目冲刺(Beta阶段)博客汇总
一.冲刺计划安排 团队作业8--Beta版本冲刺计划及安排 二.七天冲刺汇总 [Beta]第一次Daily Scrum Meeting [Beta]第二次Daily Scrum Meeting [Be ...