首页 > 代码库 > hdu 3487
hdu 3487
因为知道了翻转的延迟标记的处理,这题写起来就没有什么卡代码的地方。
这题还有个操作,把区间切下来插入某个点。
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 using namespace std; 10 11 struct SplayTree{ 12 int root; 13 int fa[N]; 14 int ch[N][2]; 15 int sz[N]; 16 int top1; 17 int top2; 18 int ss[N]; 19 int que[N]; 20 21 void pushdown(int x){ 22 if(flip[x]){ 23 flip[LC]^=1;flip[RC]^=1; 24 rever(LC);rever(RC); 25 flip[x]=0; 26 } 27 } 28 void pushup(int x){ 29 sz[x]=1+sz[LC]+sz[RC]; 30 } 31 void rotate(int x,bool f){ 32 int y=fa[x]; 33 int z=fa[y]; 34 pushdown(y); 35 pushdown(x); 36 ch[y][!f]=ch[x][f]; 37 fa[ch[x][f]]=y; 38 fa[x]=z; 39 if (z) { 40 ch[z][ch[z][1]==y] = x; 41 } 42 ch[x][f] = y; 43 fa[y]=x; 44 pushup(y); 45 } 46 void splay(int x, int g) { 47 int y = fa[x]; 48 pushdown(x); 49 while(y!=g){ 50 int z= fa[y]; 51 bool f = (ch[y][0]==x); 52 if(z != g && f == (ch[z][0]==y)){ 53 rotate(y,f); 54 } 55 rotate(x,f); 56 y=fa[x]; 57 } 58 pushup(x); 59 if(g==0) root = x; 60 } 61 void rotateTo(int k,int g) { 62 int x=root; 63 pushdown(x); 64 while(sz[LC] != k){ 65 if(k<sz[LC]){ 66 x=LC; 67 }else{ 68 k -= sz[LC] + 1; 69 x = RC; 70 } 71 pushdown(x); 72 } 73 splay(x,g); 74 } 75 void build(int l,int r,int f){ 76 if(l>r){ 77 return ; 78 } 79 int x = (l + r) >> 1; 80 LC = (x - 1 >= l)? (x - 1 + l)>> 1 :0; 81 RC = (r >= x + 1)? (x + 1 + r)>> 1 :0; 82 fa[x] = f; 83 build(l,x - 1,x); 84 build(x + 1,r,x); 85 pushup(x); 86 } 87 void erase(int x){ 88 if(x==0) 89 return; 90 int father= fa[x]; 91 int head = 0, tail=0; 92 for(que[tail++] =x ; head < tail; head++){ 93 ss[top2++] = que[head]; 94 if(ch[que[head]][0]){ 95 que[tail++]=ch[que[head]][0]; 96 } 97 if(ch[que[head]][1]){ 98 que[tail++] = ch[que[head]][1]; 99 }100 }101 ch[father][ch[father][1]==x]=0;102 pushup(father);103 }104 void treaval(int x){105 if (x) {106 pushdown(x);107 treaval(LC);108 //printf("@%d",val[x]);109 ans[cnt++]=val[x];110 treaval(RC);111 }112 }113 void newNode(int &x,int c){114 if(top2){115 x = ss[--top2];116 } else {117 x = ++top1;118 }119 LC = RC = fa[x] =0;120 sz[x] = 1;121 val[x] = c;122 flip[x]=0;123 }124 void makeTree(int &x, int l, int r, int f){125 if(l > r){126 return;127 }128 int m=(l+r)>>1;129 newNode(x, m);130 makeTree(LC,l,m-1,x);131 makeTree(RC,m+1,r,x);132 fa[x]=f;133 pushup(x);134 }135 void debug(){136 treaval(root);137 cout<<endl;138 }139 void cutTo(int l,int r,int c){140 rotateTo(l-1,0);141 rotateTo(r+1,root);142 //debug();143 int tmp=KT;144 KT=0;145 pushup(ch[root][1]);146 pushup(root);147 rotateTo(c,0);148 rotateTo(c+1,root);149 fa[tmp]=ch[root][1];150 KT=tmp;151 pushup(ch[root][1]);152 pushup(root);153 //debug();154 }155 void rever(int x){156 swap(ch[x][0],ch[x][1]);157 }158 void reverse(int l,int r){159 rotateTo(l-1,0);160 rotateTo(r+1,root);161 flip[KT]^=1;162 rever(KT);163 }164 void init(int n){165 166 top1=top2=root=0;167 newNode(root,0);168 newNode(ch[root][1],0);169 fa[ch[root][1]]=root;170 //for(int i=1;i<=n;i++)scanf("%d",&num[i]);171 makeTree(KT,1,n,ch[root][1]);172 pushup(ch[root][1]);173 pushup(root);174 }175 void solve(int n,int m){176 char op[10];177 int l,r;178 int c;179 180 for(int i=0;i<m;i++){181 182 scanf("%s%d%d",op,&l,&r);183 if(op[0]==‘F‘){184 reverse(l,r);185 }else{186 scanf("%d",&c);187 cutTo(l,r,c);188 }189 }190 cnt=0;191 treaval(root);192 for(int i=1;i<n;i++){193 printf("%d ",ans[i]);194 }195 printf("%d\n",ans[n]);196 197 }198 int val[N];199 int flip[N];200 int num[N];201 int ans[N];202 int cnt;203 }spt;204 int main()205 {206 int n,m;207 208 while(scanf("%d%d",&n,&m),n>=0||m>=0){209 spt.init(n);210 spt.solve(n,m);211 }212 return 0;213 }
hdu 3487
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。