Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
AC程序。不容易呀!!!#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <vector> #define MAX 50001 using namespace std; int n,m; int ne; struct edge { int from,to,next; int weight; }P[MAX*2]; int w[MAX],deep[MAX]; int visit[MAX]; int head[MAX*2]; int parent[MAX]; int f[MAX][20],fmax[MAX][20],fmin[MAX][20],fdmax[MAX][20],fdmin[MAX][20]; void insert(int x,int y,int weight) { P[ne].from=x;P[ne].to=y;P[ne].weight=weight;P[ne].next=head[x];head[x]=ne++; P[ne].from=y;P[ne].to=x;P[ne].weight=weight;P[ne].next=head[y];head[y]=ne++; } void dfs(int now,int fa,int step) { int i,j; int next; visit[now]=true; deep[now]=step; parent[now]=fa; for(i=0;(1<<i)<=deep[now]+1;i++) if(f[now][i - 1] != - 1) { f[now][i] = f[f[now][i - 1]][i - 1]; if(f[now][i]==-1) continue; fmax[now][i] = max(fmax[now][i - 1], fmax[f[now][i - 1]][i - 1]); fmin[now][i] = min(fmin[now][i - 1], fmin[f[now][i - 1]][i - 1]); fdmax[now][i] = max(fdmax[f[now][i - 1]][i - 1],max(fdmax[now][i - 1],fmax[f[now][i - 1]][i - 1] - fmin[now][i - 1])); fdmin[now][i] = min(fdmin[f[now][i - 1]][i - 1],min(fdmin[now][i - 1],fmin[f[now][i - 1]][i - 1] - fmax[now][i - 1])); } for(i=head[now];i+1;i=P[i].next) { next=P[i].to; if(visit[next]) continue; f[next][0]=now; fmax[next][0]=max(w[now],w[next]); fmin[next][0]=min(w[now],w[next]); fdmax[next][0]=w[now]-w[next]; fdmin[next][0]=w[now]-w[next]; dfs(next,now,step+1); } } int LCA(int a,int b) { int i,j; if(deep[a]<deep[b]) swap(a,b); i=0; while(deep[a]>=(1<<i)) i++; i--; for(j=i;j>=0;j--) if(deep[a]-(1<<j)>=deep[b]) a=f[a][j]; if(a==b) return a; for(j=i;j>=0;j--) if(f[a][j]!=-1&&f[a][j]!=f[b][j]) { a=f[a][j]; b=f[b][j]; } return parent[a]; } int bb[2][35]; bool flg[35]; void get_max_min(int a,int b,int &ma,int &mi,int &mca,int &mci) { int i,j; memset(flg,0,sizeof flg); ma = mi = w[a]; mca = mci = w[b] - w[a]; for(i = deep[a] - deep[b],j = 0; i; i >>= 1, ++ j) if(i & 1) { ma = max(ma,fmax[a][j]); mi = min(mi,fmin[a][j]); mca = max(mca,fdmax[a][j]); mci = min(mci,fdmin[a][j]); bb[0][j] = fmax[a][j]; bb[1][j] = fmin[a][j]; flg[j] = 1; a = f[a][j]; } for(i = 16 - 1; i > 0; -- i) for(j = i - 1; j >= 0; -- j) if(flg[i] && flg[j]) { mca = max(mca,bb[0][i] - bb[1][j]); mci = min(mci,bb[1][i] - bb[0][j]); } } int main() { int i,j; int x,y,weight; memset(head,-1,sizeof head); ne=2; memset(f,-1,sizeof(f)); memset(fmax,0xfc,sizeof fmax); memset(fmin,0x7f,sizeof fmin); memset(fdmax,0xfc,sizeof fdmax); memset(fdmin,0x7f,sizeof fdmin); memset(visit,0,sizeof(visit)); scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&w[i]); for(i=1;i<=n-1;i++) { scanf("%d%d",&x,&y); insert(x,y,1); } dfs(1,-1,0); scanf("%d",&m); while(m--) { scanf("%d%d",&x,&y); int c=LCA(x,y); int ma[2],mi[2],mca[2],mci[2],ans = 0; get_max_min(x,c,ma[0],mi[0],mca[0],mci[0]); get_max_min(y,c,ma[1],mi[1],mca[1],mci[1]); ans = max(0,max(mca[0], - mci[1])); ans = max(ans,ma[1] - mi[0]); printf("%d\n",ans); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator