| ||||||||||
| 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 | |||||||||
splay 解出来了,但是速度慢,1700ms+代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <vector>
#include <set>
using namespace std;
const int maxn=5e4+5;
int fa[maxn],ch[maxn][2],rev[maxn],Min[maxn],Max[maxn],d1[maxn],d2[maxn],n,val[maxn],sta[maxn],top=0;
int getlc(int x)
{
return ch[fa[x]][1]==x;
}
bool isroot(int x)
{
return fa[x]==0||(ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x);
}
void merge(int x,int y,int w)
{
ch[x][w]=y;
fa[y]=x;
}
void update(int x)
{
Min[x]=Max[x]=val[x];
int t1=0,t2=0,t3=0,t4=0;
if(ch[x][0])
{
Min[x]=min(Min[x],Min[ch[x][0]]);
Max[x]=max(Max[x],Max[ch[x][0]]);
t1=max(d1[ch[x][0]],val[x]-Min[ch[x][0]]);
t3=max(d2[ch[x][0]],Max[ch[x][0]]-val[x]);
}
if(ch[x][1])
{
Min[x]=min(Min[x],Min[ch[x][1]]);
Max[x]=max(Max[x],Max[ch[x][1]]);
t2=max(d1[ch[x][1]],Max[ch[x][1]]-val[x]);
t4=max(d2[ch[x][1]],val[x]-Min[ch[x][1]]);
}
d1[x]=max(t1,t2);
d2[x]=max(t3,t4);
if(ch[x][0]&&ch[x][1])
{
d1[x]=max(d1[x],Max[ch[x][1]]-Min[ch[x][0]]);
d2[x]=max(d2[x],Max[ch[x][0]]-Min[ch[x][1]]);
}
}
void push_down(int x)
{
if(!rev[x]) return;
swap(ch[x][0],ch[x][1]);
swap(d1[ch[x][0]],d2[ch[x][0]]);
swap(d1[ch[x][1]],d2[ch[x][1]]);
rev[ch[x][0]]^=1;
rev[ch[x][1]]^=1;
rev[x]=0;
}
void rot(int x,int w)
{
int z=fa[fa[x]];
if(!isroot(fa[x])) ch[z][getlc(fa[x])]=x;
merge(fa[x],ch[x][w^1],w);
merge(x,fa[x],w^1);
update(fa[x]);
fa[x]=z;
}
void splay(int x)
{
sta[++top]=x;
for(int i=x;!isroot(i);i=fa[i]) sta[++top]=fa[i];
while(top) push_down(sta[top--]);
while(!isroot(x)&&!isroot(fa[x]))
{
int p=getlc(x),q=getlc(fa[x]);
p==q?(rot(fa[x],q),rot(x,p)):(rot(x,p),rot(x,q));
}
if(!isroot(x)) rot(x,getlc(x));
update(x);
}
void access(int x)
{
for(int t=0;x;t=x,x=fa[x])
{
splay(x);
ch[x][1]=t;
update(x);
}
}
void makeroot(int x) {access(x);splay(x);rev[x]^=1;swap(d1[x],d2[x]);}
struct E{
int v,next;
}edge[maxn*2];
int head[maxn],tot;
void init()
{
memset(head,-1,sizeof(head));
tot=-1;
memset(rev,0,sizeof(rev));
memset(ch,0,sizeof(ch));
}
void addedge(int u,int v)
{
edge[++tot].v=v;edge[tot].next=head[u];
head[u]=tot;
edge[++tot].v=u;edge[tot].next=head[v];
head[v]=tot;
}
void dfs(int u,int father)
{
fa[u]=father;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(v==father) continue;
dfs(v,u);
}
}
int main()
{
init();
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&val[i]);
int u,v,op;
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
}
dfs(1,0);
scanf("%d",&op);
while(op--)
{
scanf("%d%d",&u,&v);
makeroot(u);
access(v);
splay(v);
printf("%d\n",d1[v]);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator