首页 > 代码库 > hdu 4453
hdu 4453
6种操作:
add x:由于涉及到这是一个循环数组。可能有操作(尾-头)的区间,如果这样,直接将尾部的区间切下来放到最前面,然后调整那个“指针”。
reverse x:同add操作一样,可能涉及(尾-头)。
insert x
delete
move x:注意指针的变化
query
一气呵成。splay的题目赶脚就是操作理清楚,然后coding的时候小心点。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #define KT ch[ch[root][1]][0] 6 #define LC ch[x][0] 7 #define RC ch[x][1] 8 #define N 310001 9 10 using namespace std; 11 12 typedef long long LL; 13 14 struct SplayTree{ 15 int root; 16 int fa[N]; 17 int ch[N][2]; 18 int sz[N]; 19 int top1; 20 int top2; 21 int ss[N]; 22 int que[N]; 23 24 25 void rotate(int x,bool f){ 26 int y=fa[x]; 27 int z=fa[y]; 28 pushdown(y); 29 pushdown(x); 30 ch[y][!f]=ch[x][f]; 31 fa[ch[x][f]]=y; 32 fa[x]=z; 33 if (z) { 34 ch[z][ch[z][1]==y] = x; 35 } 36 ch[x][f] = y; 37 fa[y]=x; 38 pushup(y); 39 } 40 void splay(int x, int g) { 41 int y = fa[x]; 42 pushdown(x); 43 while(y!=g){ 44 int z= fa[y]; 45 bool f = (ch[y][0]==x); 46 if(z != g && f == (ch[z][0]==y)){ 47 rotate(y,f); 48 } 49 rotate(x,f); 50 y=fa[x]; 51 } 52 pushup(x); 53 if(g==0) root = x; 54 } 55 void rotateTo(int k,int g) { 56 int x=root; 57 pushdown(x); 58 while(sz[LC] != k){ 59 if(k<sz[LC]){ 60 x=LC; 61 }else{ 62 k -= sz[LC] + 1; 63 x = RC; 64 } 65 pushdown(x); 66 } 67 splay(x,g); 68 } 69 void build(int l,int r,int f){ 70 if(l>r){ 71 return ; 72 } 73 int x = (l + r) >> 1; 74 LC = (x - 1 >= l)? (x - 1 + l)>> 1 :0; 75 RC = (r >= x + 1)? (x + 1 + r)>> 1 :0; 76 fa[x] = f; 77 build(l,x - 1,x); 78 build(x + 1,r,x); 79 pushup(x); 80 } 81 void erase(int x){ 82 if(x==0) 83 return; 84 int father= fa[x]; 85 int head = 0, tail=0; 86 for(que[tail++] =x ; head < tail; head++){ 87 ss[top2++] = que[head]; 88 if(ch[que[head]][0]){ 89 que[tail++]=ch[que[head]][0]; 90 } 91 if(ch[que[head]][1]){ 92 que[tail++] = ch[que[head]][1]; 93 } 94 } 95 ch[father][ch[father][1]==x]=0; 96 pushup(father); 97 } 98 void makeTree(int &x, int l, int r, int f){ 99 if(l > r){100 return;101 }102 int m=(l+r)>>1;103 newNode(x, num[m]);104 makeTree(LC,l,m-1,x);105 makeTree(RC,m+1,r,x);106 fa[x]=f;107 pushup(x);108 }109 110 111 void newNode(int &x,int c){112 if(top2){113 x = ss[--top2];114 } else {115 x = ++top1;116 }117 LC = RC = fa[x] =0;118 sz[x] = 1;119 val[x]=c;120 flip[x]=add[x]=0;121 122 }123 void pushdown(int x){124 if(add[x]){125 add[LC]+=add[x];add[RC]+=add[x];126 val[LC]+=add[x];val[RC]+=add[x];127 add[x]=0;128 }129 if(flip[x]){130 flip[LC]^=1;flip[RC]^=1;131 reverse(LC);reverse(RC);132 flip[x]=0;133 }134 }135 void pushup(int x){136 sz[x]=1+sz[LC]+sz[RC];137 }138 void reverse(int x){139 swap(LC,RC);140 }141 void treaval(int x){142 if (x) {143 pushdown(x);144 treaval(LC);145 printf("@%I64d",val[x]);146 treaval(RC);147 }148 }149 void debug(){150 treaval(root);151 cout<<endl;152 }153 void cutTo(int l,int r,int c){154 rotateTo(l-1,0);155 rotateTo(r+1,root);156 int tmp=KT;157 KT=0;158 pushup(ch[root][1]);159 pushup(root);160 161 rotateTo(c,0);162 rotateTo(c+1,root);163 fa[tmp]=ch[root][1];164 KT=tmp;165 pushup(ch[root][1]);166 pushup(root);167 }168 void gettar(int len){169 int size=sz[root]-2;170 if(pot+len-1>size){171 cutTo(pot,size,0);172 pot=1;173 }174 rotateTo(pot-1,0);175 rotateTo(pot+len,root);176 }177 void Add(int x){178 gettar(k2);179 add[KT]+=x;180 val[KT]+=x;181 }182 void Rever(){183 gettar(k1);184 flip[KT]^=1;185 reverse(KT);186 }187 void Insert(int x){188 rotateTo(pot,0);189 rotateTo(pot+1,root);190 newNode(KT,x);191 fa[KT]=ch[root][1];192 pushup(ch[root][1]);193 pushup(root);194 }195 void Dele(){196 rotateTo(pot-1,0);197 rotateTo(pot+1,root);198 erase(KT);199 pushup(ch[root][1]);200 pushup(root);201 202 int size=sz[root]-2;203 204 if(pot>size)pot=1;205 }206 void Move(int x){207 int size=sz[root]-2;208 if(x==1){209 pot--;210 if(pot==0){211 pot=size;212 }213 }else{214 pot++;215 if(pot>size){216 pot=1;217 }218 }219 }220 void Query(){221 rotateTo(pot,0);222 printf("%I64d\n",val[root]);223 }224 void init(int n,int K1,int K2){225 k1=K1,k2=K2;226 227 top1=top2=root=0;228 newNode(root,0);229 newNode(ch[root][1],0);230 fa[ch[root][1]]=root;231 232 for(int i=1;i<=n;i++)scanf("%d",&num[i]);233 234 makeTree(KT,1,n,ch[root][1]);235 pot=1;236 pushup(ch[root][1]);237 pushup(root);238 }239 void solve(int m){240 char op[10];241 int x;242 //debug();243 for(int i=1;i<=m;i++){244 //cout<<sz[root]<<endl;245 scanf("%s",op);246 if(op[0]==‘q‘){247 Query();248 }else if(op[0]==‘m‘){249 scanf("%d",&x);250 Move(x);251 }else if(op[0]==‘i‘){252 scanf("%d",&x);253 Insert(x);254 }else if(op[0]==‘r‘){255 Rever();256 }else if(op[0]==‘a‘){257 scanf("%d",&x);258 Add(x);259 }else{260 Dele();261 }262 //debug();263 }264 }265 int pot;266 int k1,k2;267 LL val[N];268 int flip[N];269 LL add[N];270 int num[N];271 272 }spt;273 int main()274 { //freopen("out.txt","w",stdout);275 int n,m,k1,k2;276 int cas=1;277 while(scanf("%d%d%d%d",&n,&m,&k1,&k2),278 n||m||k1||k2){279 printf("Case #%d:\n",cas++);280 spt.init(n,k1,k2);281 spt.solve(m);282 283 }284 return 0;285 }
hdu 4453
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。