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. 不用SWIG,Go使用C++代码的方式

    将C++代码用C作一次封装,就可以让Go调用了. 这是一个C++头文件: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #ifndef CGO_CPPGO_C ...

  2. Java 接口和抽象类差别

    原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想非常大程度上取决于它的总体架构,而这个总体架构事实上 ...

  3. bootbox api

    bootbox是boostrap集成的弹窗,基本能完成后台系统的需求,下面是一些使用方法 1.bootbox.alert bootbox.alert使用方法主要有三种 直接传内容 bootbox.al ...

  4. QT+vs2010下改变可执行程序的图标

    原地址:http://blog.163.com/tijijun@126/blog/static/6820974520134209457308/ 在解决方案下面的工程里,点击右键 ->选择[添加( ...

  5. Linux 安装Redis全过程日志

    wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-stable make ...

  6. 程序员必须知道的几个Git代码托管平台(转)

    上一篇博客中2015继续任性——不会Git命令,照样玩转Git我们简单的介绍了在VS2013中使用Git,和GitHub客户端的使用.那么使用Git到底有什么好处呢?最为明显的是支持Git代码托管的平 ...

  7. UVA 10718 Bit Mask 贪心+位运算

    题意:给出一个数N,下限L上限U,在[L,U]里面找一个整数,使得N|M最大,且让M最小. 很明显用贪心,用位运算搞了半天,样例过了后还是WA,没考虑清楚... 然后网上翻到了一个人家位运算一句话解决 ...

  8. 一个关于native sql的程序

    *&---------------------------------------------------------------------* *& Report ZHR_BPM11 ...

  9. UVA 11464 - Even Parity(枚举方法)

    D Even Parity Input: Standard Input Output: Standard Output We have a grid of size N x N. Each cell ...

  10. Eclipse Maven 插件地址

    http://download.eclipse.org/technology/m2e/releases maven 插件安装地址