Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 378 | Accepted: 119 |
Description
Input
Output
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
#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; }