码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj2002: [Hnoi2010]Bounce 弹飞绵羊

时间:2015-05-12 01:26:30      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!