标签:longest short add mil make cts tin cut ret
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
#include<bits/stdc++.h> using namespace std; #define ll long long #define pi (4*atan(1.0)) #define eps 1e-14 const int N=1e5+10,M=1e6+10,inf=1e9+10; const ll INF=1e18+10,mod=2147493647; struct is { int v,w,nex; }edge[N]; int head[N],edg; int node1,node2,deep; int dis[N],num[N]; int pos[N]; void init() { memset(num,0,sizeof(num)); memset(head,-1,sizeof(head)); memset(dis,0,sizeof(dis)); edg=0; deep=0; } void add(int u,int v,int w) { edg++; edge[edg].v=v; edge[edg].w=w; edge[edg].nex=head[u]; head[u]=edg; } void dfs(int u,int fa,int val,int &node) { dis[u]=max(dis[u],val); if(val>deep) { deep=val; node=u; } for(int i=head[u];i!=-1;i=edge[i].nex) { int v=edge[i].v; int w=edge[i].w; if(v==fa)continue; dfs(v,u,val+w,node); } } int dpi[N][30]; int dpa[N][30]; int minn(int x,int y) { return num[x]<=num[y]?x:y; } void rmqi(int len) { for(int i=0; i<len; i++) dpi[i][0]=i; for(int j=1; (1<<j)<len; j++) for(int i=0; i+(1<<j)-1<len; i++) dpi[i][j]=minn(dpi[i][j-1],dpi[i+(1<<(j-1))][j-1]); } int queryi(int l,int r) { int x=pos[r-l+1]; return minn(dpi[l][x],dpi[r-(1<<x)+1][x]); } int maxx(int x,int y) { return num[x]>=num[y]?x:y; } void rmqa(int len) { for(int i=0; i<len; i++) dpa[i][0]=i; for(int j=1; (1<<j)<len; j++) for(int i=0; i+(1<<j)-1<len; i++) dpa[i][j]=maxx(dpa[i][j-1],dpa[i+(1<<(j-1))][j-1]); } int querya(int l,int r) { int x=pos[r-l+1]; return maxx(dpa[l][x],dpa[r-(1<<x)+1][x]); } int n,m; int main() { pos[0]=-1; for(int i=1;i<100000;i++) pos[i]=pos[i>>1]+1; while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0)break; init(); for(int i=1;i<n;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,w); } dfs(1,-1,0,node1); deep=0; dfs(node1,-1,0,node2); dfs(node2,-1,0,node1); for(int i=1;i<=n;i++) num[i]=max(dis[i],num[i]); rmqi(n+1); rmqa(n+1); while(m--) { int z; scanf("%d",&z); int l=1,r=1,ans=0; while(1) { while(num[querya(l,r)]-num[queryi(l,r)]<=z&&r<=n)r++; ans=max(ans,r-l); if(r>n) break; l++; } printf("%d\n",ans); } } return 0; }
hdu 4123 Bob’s Race 树的直径+rmq+尺取
标签:longest short add mil make cts tin cut ret
原文地址:http://www.cnblogs.com/jhz033/p/6095930.html