标签:ted skin ipa oge rac 函数 std == eof
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; typedef long long LL; const int N=50005; int h[N],H[N],H2[N],ans[N],tot; int f1[N][20],f2[N][20]; struct edge { int to; int next; int x; }e[2*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]=0; H2[id]=0; for(int i=h[id];i!=-1;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!=-1;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=1;i<=n;i++) f1[i][0]=ans[i],f2[i][0]=ans[i]; int len=2; for(int s=1;len<=n;s++,len*=2) { for(int i=1;i+len-1<=n;i++) { f1[i][s]=max(f1[i][s-1],f1[i+len/2][s-1]); f2[i][s]=min(f2[i][s-1],f2[i+len/2][s-1]); } } } int get(int i,int j) { int len=-1; int t=j-i+1; while(t) { len++; t>>=1; } return max(f1[i][len],f1[j-(1<<len)+1][len])-min(f2[i][len],f2[j-(1<<len)+1][len]); } void init() { tot=0; memset(h,-1,sizeof(h)); } int main() { int n,m; while(scanf("%d%d",&n,&m)&&(n+m)) { init(); for(int i=1;i<n;i++) { int u,v,x; scanf("%d%d%d",&u,&v,&x); add(u,v,x); } getH(1,-1); dfs(1,-1,0); cal(n); while(m--) { int Q; scanf("%d",&Q); int res=0; int pos=1; for(int i=1;i<=n;i++) { if(i-pos+1<=res) continue; ///优化一下; int tmp=get(pos,i); while(tmp>Q) { pos++; tmp=get(pos,i); } res=max(res,i-pos+1); } printf("%d\n",res); } } return 0; } /** 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)
标签:ted skin ipa oge rac 函数 std == eof
原文地址:http://www.cnblogs.com/chen9510/p/7627028.html