| ||||||||||
| 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 | |||||||||
好裸的动态树,附上代码#include <cstdio>
#include <cstring>
const int maxn = 10001;
int f[maxn],s[maxn][2];
bool visit[maxn];
int n;
int updata(int x)
{
}
bool truefa(int x)
{
return f[x] && (s[f[x]][0] == x || s[f[x]][1] == x);
}
int rotate(int x,int p)
{
int y = f[x],z = f[y],son = s[x][p^1];
if (s[z][0] == y) s[z][0] = x;
if (s[z][1] == y) s[z][1] = x;
f[x] = z;
s[x][p^1] = y;
f[y] = x;
s[y][p] = son;
f[son] = y;
updata(y);
updata(x);
return 0;
}
int splay(int x)
{
while (truefa(x))
{
int y = f[x],z = f[y],p,q;
if (truefa(y))
{
if (x == s[y][0]) p = 0; else p = 1;
if (y == s[z][0]) q = 0; else q = 1;
if (p == q) {rotate(y,q); rotate(x,p);}
else {rotate(x,p); rotate(x,q);}
}
else if (s[y][0] == x) rotate(x,0); else rotate(x,1);
}
return 0;
}
int access(int p)
{
int q;
for (q = 0; p > 0; p = f[p])
{
splay(p);
s[p][1] = q;
updata(q = p);
}
return q;
}
int main()
{
int i,j,k,task;
freopen("1330.in","r",stdin);
freopen("1330.out","w",stdout);
for (scanf("%d",&task); task > 0; --task)
{
memset(f,0,sizeof(f));
memset(s,0,sizeof(s));
scanf("%d",&n);
for (i = 1; i < n; ++i)
{
scanf("%d%d",&j,&k);
f[k] = j;
}
scanf("%d%d",&j,&k);
access(j);
printf("%d\n",access(k));
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator