标签:
lct入门题?只需要Link Cut,不需要换根和维护其他标记
1 #include<iostream> 2 #include<cstring> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<cstdio> 6 using namespace std; 7 8 const int Maxn = 200010; 9 10 int ch[Maxn][2],p[Maxn],sz[Maxn],tl[Maxn]; 11 int n,m; 12 13 const int D=15000000; 14 char in[D],out[300010*10],*I=in,*O=out; 15 #define gc (*I++) 16 #define pc(x) ((*O++)=x) 17 template <typename Q> 18 void gt(Q&x) { 19 static char c,f; 20 for(c=gc,f=0;!isdigit(c);c=gc)if(c==‘-‘) f=1; 21 for(x=0;isdigit(c);c=gc) x=x*10+c-‘0‘; 22 f && (x=-x); 23 } 24 template <typename Q> 25 void pt(Q x){ 26 static char stk[20]; 27 static int top; 28 top=0; 29 if(x==0) pc(‘0‘); 30 for(;x;x/=10) stk[++top] = x%10+‘0‘; 31 for(int i=top;i;i--) pc(stk[i]); 32 } 33 34 bool isroot(int x){ 35 return ch[p[x]][0]!=x && ch[p[x]][1]!=x; 36 } 37 38 void update(int x) { 39 if(x==0) return; 40 sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1; 41 } 42 43 void rotate(int x) { 44 int y=p[x],z=p[y]; 45 int l=ch[y][1]==x,r=l^1; 46 if(!isroot(y)) ch[z][ch[z][1]==y]=x; 47 p[ch[x][r]]=y; 48 p[y]=x; 49 p[x]=z; 50 51 ch[y][l]=ch[x][r]; 52 ch[x][r]=y; 53 54 update(y); 55 update(x); 56 } 57 58 void splay(int x){ 59 for(;!isroot(x);){ 60 int y=p[x],z=p[y]; 61 if(!isroot(y)){ 62 if( (ch[y][1]==x)^(ch[z][1]==y) ) 63 rotate(x);else rotate(y); 64 } 65 rotate(x); 66 } 67 } 68 69 void access(int x){ 70 for(int t=0;x;x=p[t=x]){ 71 splay(x); 72 ch[x][1]=t; 73 update(x); 74 } 75 } 76 77 int getroot(int x){ 78 for(access(x),splay(x);ch[x][0];x=ch[x][0]); 79 return x; 80 } 81 82 void cut(int x){ 83 access(x); 84 splay(x); 85 p[ch[x][0]]=0; 86 ch[x][0]=0; 87 update(x); 88 } 89 90 void join(int x,int y) { 91 cut(x); 92 p[x]=y; 93 update(y); 94 } 95 96 void init(){ 97 gt(n); 98 for(int i=1;i<=n;i++) { 99 sz[i]=1; 100 gt(tl[i]); 101 p[i]=min(tl[i]+i,n+1); 102 tl[i]=p[i]; 103 } 104 sz[n+1]=1; 105 } 106 107 void work() { 108 gt(m); 109 int cmd,a,b; 110 for(int i=1;i<=m;i++) { 111 gt(cmd),gt(a),a++; 112 if(cmd==1) { 113 access(a); 114 splay(a); 115 pt(sz[a]-1); 116 pc(‘\n‘); 117 }else{ 118 gt(b); 119 int y=min(a+b,n+1); 120 if(y==tl[a]) continue; 121 join(a,tl[a]=y); 122 } 123 } 124 } 125 126 127 int main() { 128 #ifdef DEBUG 129 freopen("in.txt","r",stdin); 130 freopen("out.txt","w",stdout); 131 #endif 132 fread(in,1,D,stdin); 133 134 init(); 135 work(); 136 137 return printf(out),0; 138 }
bzoj2002: [Hnoi2010]Bounce 弹飞绵羊
标签:
原文地址:http://www.cnblogs.com/showson/p/4496039.html