1 #include<iostream>
 2 #include<cstdio>
 3 #define MAXN 100010
 4 using namespace std;
 5 int read()
 6 {
 7     int x=0,t=1,c;
 8     while(!isdigit(c=getchar()))if(c=='-')t=-1;
 9     while(isdigit(c))x=x*10+c-'0',c=getchar();
10     return x*t;
11 }
12 int ch[MAXN][2],fa[MAXN];
13 int size[MAXN];
14 bool rev[MAXN];
15 bool isroot(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
16 void pushdown(int x)
17 {
18     if(rev[x])
19     {
20         rev[x]^=1;if(ch[x][0])rev[ch[x][0]]^=1;if(ch[x][1])rev[ch[x][1]]^=1;
21         swap(ch[x][0],ch[x][1]);
22     }
23 }
24 void maintain(int x)
25 {
26     size[x]=size[ch[x][0]]+size[ch[x][1]]+1;
27 }
28 void rotate(int x)
29 {
30     int d=(ch[fa[x]][1]==x),y=fa[x],z=fa[y];
31     pushdown(y);pushdown(x);
32     if(!isroot(y))ch[z][ch[z][1]==y]=x;
33     fa[x]=z;
34     ch[y][d]=ch[x][d^1];
35     if(ch[x][d^1])fa[ch[x][d^1]]=y;
36     ch[x][d^1]=y;
37     fa[y]=x;
38     maintain(y);maintain(x);
39 }
40 int Q[MAXN],cntQ=0;
41 void splay(int x)
42 {
43     while(!isroot(x))
44     {
45         int y=fa[x],z=fa[fa[x]];
46         if(!isroot(fa[x]))
47         {
48             if(ch[y][1]==x^ch[z][1]==y)rotate(x);
49             else rotate(y);
50         }
51         rotate(x);
52     }
53 }
54 void access(int x)
55 {
56     for(int i=x;i;i=fa[i])Q[cntQ++]=i;
57     while(cntQ--)pushdown(Q[cntQ]);
58     for(int i=x,t=0;i;t=i,i=fa[i])splay(i),ch[i][1]=t,maintain(i);
59 }
60 void makeroot(int x)
61 {
62     access(x);splay(x);rev[x]^=1;
63 }
64 void split(int x,int y)
65 {
66     makeroot(x);access(y);splay(x);
67 }
68 void link(int x,int y)
69 {
70     access(y),splay(y),fa[y]=x;
71 }
72 void cut(int x,int y)
73 {
74     split(x,y);ch[x][1]=fa[y]=0;maintain(x);
75 }
76 int main()
77 {
78     char o[2];
79     while(true)
80     {
81         scanf("%s",o);
82         if(o[0]=='l')
83         {
84             int x=read(),y=read();
85             link(x,y);
86         }
87         if(o[0]=='c')
88         {
89             int x=read(),y=read();
90             cut(x,y);
91         }
92         if(o[0]=='q')
93         {
94             int x=read(),y=read();
95             split(x,y);splay(x);
96             printf("Size:%d\n",size[x]);
97         }
98     }
99 }

最简单的模板,调了一个小时。。。各大神犇轻喷

posted on 2016-06-18 11:44  吕紫剑  阅读(265)  评论(1编辑  收藏  举报