Bob’s Race
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 378   Accepted: 119

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

Source


题目大意:告诉n,m , 表示一棵树n个节点,接下来n-1条边将n个节点,m表示m组查询q,查询最长的连续区间差值不超过q的长度。

解体思路:与我的   
poj 3162 Walking Race (DFS + 线段树) 有点类似,但是,比那个复杂,不同在那个只有一次查询,这次m次查询,那个效率 O( n*lgn ),如果用那个方法,这次也就是
 O(m* n*lgn )的效率,实验发现超时了,最后用了 rmq算法代替了线段树,用rmq预处理好,查询每次区间的效率为 1 而不是 lgn ,所以效率变为   O(m* n),花了 1秒左右AC。 

#include <iostream>
#include <cstdio>
#include <climits>
#include <map>
#include <vector>
#include <algorithm>
using namespace std; const int maxn=100010; struct edge{
int u,v,w;
int next;
edge(int u0=0,int v0=0,int w0=0){ u=u0;v=v0;w=w0;}
}e[maxn*2]; int n,m,cnt,head[maxn],d[maxn],dx[maxn],dy[maxn],qmin[maxn],qmax[maxn],mx,mn;
int maxsum[maxn][20],minsum[maxn][20],flog[maxn]; void initial(){
cnt=0;
for(int i=0;i<=n;i++) head[i]=-1;
} void addedge(int u,int v,int w){
e[cnt]=edge(u,v,w);
e[cnt].next=head[u];
head[u]=cnt++;
} void input(){
int x,y,w0;
for(int i=2;i<=n;i++){
scanf("%d%d%d",&x,&y,&w0);
addedge(x,y,w0);
addedge(y,x,w0);
}
} void dfs(int u,int fa,int dis,int *d){
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v,w=e[i].w;
if(v!=fa) dfs(v,u,d[v]=dis+w,d);
}
} void solve1(){
int x=1,y=1;
dfs(1,-1,d[1]=0,d);
for(int i=1;i<=n;i++) if(d[x]<d[i]) x=i;
dfs(x,-1,dx[x]=0,dx);
for(int i=1;i<=n;i++) if(dx[y]<dx[i]) y=i;
dfs(y,-1,dy[y]=0,dy);
for(int i=1;i<=n;i++) d[i]=max(dx[i],dy[i]);
//for(int i=1;i<=n;i++) cout<<"dis["<<i<<"]:"<<d[i]<<endl;
} void getrmq(){
int r=2,cnt=0;
for(int i=1;i<=n;i++){
if(i<r) flog[i]=cnt;
else{
flog[i]=++cnt;
r=r<<1;
}
}
for(int i=1;i<=n;i++){
maxsum[i][0]=d[i];
minsum[i][0]=d[i];
}
for(int j=1;j<=flog[n];j++)
for(int i=1;i<=n;i++){
if(i+(1<<j)-1<=n){
maxsum[i][j]=max(maxsum[i][j-1],maxsum[i+(1<<(j-1))][j-1]);
minsum[i][j]=min(minsum[i][j-1],minsum[i+(1<<(j-1))][j-1]);
}
}
} int getmin(int l,int r){
int x=flog[r-l+1];
return min(minsum[l][x],minsum[r-(1<<x)+1][x]);
} int getmax(int l,int r){
int x=flog[r-l+1];
return max(maxsum[l][x],maxsum[r-(1<<x)+1][x]);
} void solve2(){
int be=1,en=1,ans=1,q=1;
map <int,int> mp;
vector<int> v;
map <int,int>::iterator it;
for(int i=0;i<m;i++){
scanf("%d",&q);
mp[q]=0;
v.push_back(q);
}
for(it=mp.begin();it!=mp.end();it++){
int be=1,en=be+ans-1;
while(en<=n){
mn=getmin(be,en),mx=getmax(be,en);
if(mx-mn<=(it->first)){
ans=max(en-be+1,ans);
en++;
}else{
be++;
en=max(en,be+ans-1);
}
}
it->second=ans;
}
for(int i=0;i<m;i++) printf("%d\n",mp[v[i]]);
} void computing(){
solve1();
getrmq();
solve2();
} int main(){
while(scanf("%d%d",&n,&m)!=EOF && (n||m) ){
initial();
input();
computing();
}
return 0;
}

POJ 4003 Bob’s Race && HDU4123 Bob’s Race (dfs+rmq)的更多相关文章

  1. POJ 3207 Ikki's Story IV - Panda's Trick(2-sat问题)

    POJ 3207 Ikki's Story IV - Panda's Trick(2-sat问题) Description liympanda, one of Ikki's friend, likes ...

  2. POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE

    POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...

  3. [poj 2331] Water pipe ID A*迭代加深搜索(dfs)

    Water pipe Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 2265 Accepted: 602 Description ...

  4. poj 1724:ROADS(DFS + 剪枝)

    ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10777   Accepted: 3961 Descriptio ...

  5. poj 3083 Children of the Candy Corn(DFS+BFS)

    做了1天,总是各种错误,很无语 最后还是参考大神的方法 题目:http://poj.org/problem?id=3083 题意:从s到e找分别按照左侧优先和右侧优先的最短路径,和实际的最短路径 DF ...

  6. POJ 1564(HDU 1258 ZOJ 1711) Sum It Up(DFS)

    题目链接:http://poj.org/problem?id=1564 题目大意:给定一个整数t,和n个元素组成的集合.求能否用该集合中的元素和表示该整数,如果可以输出所有可行解.1<=n< ...

  7. POJ 1321-棋盘问题(DFS 递归)

    POJ 1321-棋盘问题 K - DFS Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I6 ...

  8. poj 1011 Sticks (DFS+剪枝)

    Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 127771   Accepted: 29926 Descrip ...

  9. 数独问题的介绍及POJ 2676-Sudoku(dfs+剪枝)

    知道是数独问题后犹豫了一下要不要做(好像很难的样纸==.),用dfs并剪枝,是一道挺规范的搜索题. 先介绍以下数独吧- 数独(Sudoku)是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上 ...

随机推荐

  1. poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)

    Sum It Up Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Sub ...

  2. ImageMagick wrapper for php

    https://code.google.com/archive/p/phmagick/

  3. Qt 打包发布 不能动态打开图片显示问题

    刚写完一个图片标注工具, 发现在我电脑可以实时打开照片显示出来,在他人的电脑上就不可以. 原来Qt默认只识别png 具体解决方案: 原地址:http://blog.csdn.net/goodlixue ...

  4. 开发环境FAQ

    问: Win7下VS2008无法识别WinCE5.0SDK 答:拷贝WinXP环境(安装过VS2008 + WinCE5.0SDK)下C:/Program Files/Microsoft Visual ...

  5. G - Self Numbers(2.2.1)

    G - Self Numbers(2.2.1) Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & % ...

  6. grails一对一关联关系

    一对一关联关系开发中用的没有一对多那么广泛.可是我认为掌握以下还是有必要的.一对一关联关系有一张表存在外键,引用的通常是主表的主键.grails也对一对一关联关系提供了非常好的支持.配置也是简单的不得 ...

  7. Unity 3D 文件导入出错

    Unity 3D 文件导入出错 安装unity 时我选择了free版的,打开已有项目时出现例如以下错误提示 解决的方法: 先把要导入的文件先复制到unity3d安装文件夹下相应的文件夹内,之后再返回u ...

  8. Android开发:在onTouchEvent中处理任意时间的长按事件

    Android提供了GestureDetector类来处理一些常用的手势操作,比如说 onLongPress,onFling 等.但这里不使用GestureDetector,而是直接在自定义View重 ...

  9. 一个能够自己主动生成静态库,自己主动安装程序的Makefile

    .PHONY:clean install CC=g++ CFLAGS=-Wall -g BIN=libecho.a INCLUDE=echo SRC=src OBJS=Socket.o Rio.o T ...

  10. 关于在打包Jar文件时遇到的资源路径问题(二)

    在关于<关于在打包Jar文件时遇到的资源路径问题(一)>中,以及描述了当资源与可执行JAr分离时的资源路径代码的编写问题,后来想了想,为什么将<Java核心技术卷一>中的程序1 ...