| ||||||||||
| 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 | |||||||||
Re:Tarjan离线,做了好久才做出来,纪念一下In Reply To:Tarjan离线,做了好久才做出来,纪念一下 Posted by:OZY123 at 2016-01-04 13:19:11 > #include<cstdio>
> #include<cstring>
> const int N=50005;
> int n,m;
> struct qq
> {
> int x;
> int y;
> int last;
> };
> qq s[N*2];
> qq s1[N*2];
> qq s2[N*2];
> int k[N];
> int last[N];
> int last1[N];
> int last2[N];
> int ans[N];
> int num=0,num1=0;
> int f[N];
> bool p[N];
> int up[N];
> int down[N];
> int max[N];
> int min[N];
> int Max (int x,int y){return x>y?x:y;}
> int Min (int x,int y){return x<y?x:y;}
> void init (int x,int y)
> {
> num++;
> s[num].x=x;
> s[num].y=y;
> s[num].last=last[x];
> last[x]=num;
> }
> void init2 (int u,int k)
> {
> num1++;
> s2[num1].x=k;
> s2[num1].last=last2[u];
> last2[u]=num1;
> }
> void init1 (int x,int y,int z)
> {
> s1[z].x=x;
> s1[z].y=y;
> s1[z].last=last1[x];
> last1[x]=z;
> }
>
> int find (int x)
> {
> if (f[x]==x) return f[x];
> int fa1=f[x];
> f[x]=find(f[x]);
> up[x]=Max(up[x],Max(up[fa1],max[fa1]-min[x]));
> down[x]=Max(down[x],Max(down[fa1],max[x]-min[fa1]));
> max[x]=Max(max[x],max[fa1]);
> min[x]=Min(min[x],min[fa1]);
> return f[x];
> }
> void TJ (int x)
> {
> for (int u=last1[x];u!=-1;u=s1[u].last)
> if (p[s1[u].y])
> {
> int lca=find(s1[u].y);
> init2(lca,u);
> }
>
> f[x]=x;
> p[x]=true;
> for (int u=last[x];u!=-1;u=s[u].last)
> {
> if (p[s[u].y]==false)
> {
> TJ(s[u].y);
> f[s[u].y]=x;
> }
> }
> for(int u=last2[x];u!=-1;u=s2[u].last)
> {
> int k=s2[u].x,x=s1[k].x,y=s1[k].y;
> if (k>m)
> {
> k-=m;
> int t1=x;x=y;y=t1;
> }
> find(x); find(y);
> ans[k] = Max(up[x] , down[y]);
> ans[k] = Max(ans[k] , max[y] - min[x]);
> }
> }
> int main()
> {
> while (scanf("%d",&n)!=EOF)
> {
> num=0;num1=0;
> memset(last2,-1,sizeof(last2));
> memset(p,false,sizeof(p));
> memset(last,-1,sizeof(last));
> memset(last1,-1,sizeof(last1));
> for (int u=1;u<=n;u++)
> {
> int a;
> scanf("%d",&a);
> max[u]=min[u]=a;
> up[u]=down[u]=0;
> }
> for (int u=1;u<n;u++)
> {
> int x,y;
> scanf("%d%d",&x,&y);
> init(x,y);
> init(y,x);
> }
> scanf("%d",&m);
> for (int u=1;u<=m;u++)
> {
> int x,y;
> scanf("%d%d",&x,&y);
> init1(x,y,u);
> init1(y,x,u+m);
> }
> TJ(1);
> for (int u=1;u<=m;u++) printf("%d\n",ans[u]);
> }
> return 0;
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator