UVA 11922 Permutation Transformer(splay树)
来源:互联网 发布:阿里云免费套餐9.9 编辑:程序博客网 时间:2024/05/16 00:39
建树时节点加1,当需要旋转[a,b]的时候,其实分裂的是[a+1,b+1]的元素,所以增大一个节点,那么最后减一就可以了,如果序列的树很乱,那么用数组下标来建树。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct Node{ Node* ch[2]; int v,s; int flip; int cmp(int x) const { int d=x-ch[0]->s; if(d==1) return -1; return (d<=0?0:1); } void maintain(){ s=1+ch[0]->s+ch[1]->s; } void pushdown(){ if(flip){ flip=0; swap(ch[0],ch[1]); ch[0]->flip=!ch[0]->flip; ch[1]->flip=!ch[1]->flip; } }};Node* null=new Node();void rotate(Node* &o,int d){ Node* k=o->ch[d^1];o->ch[d^1]=k->ch[d];k->ch[d]=o; o->maintain();k->maintain();o=k;}void splay(Node* &o,int k){ o->pushdown(); int d=o->cmp(k); if(d==1) k-=o->ch[0]->s+1; if(d!=-1) { Node* p=o->ch[d]; p->pushdown(); int d2=p->cmp(k); int k2=(d2==0?k:k-p->ch[0]->s-1); if(d2!=-1) { splay(p->ch[d2],k2); if(d==d2) rotate(o,d^1);else rotate(o->ch[d],d); } rotate(o,d^1); }}void split(Node* o,int k,Node* &left,Node* &right){ splay(o,k); left=o; right=o->ch[1]; o->ch[1]=null; left->maintain();}Node* merge(Node* left,Node* right){ splay(left,left->s); left->ch[1]=right; left->maintain(); return left;}void build(Node* &o,int l,int r){ if(l>r) {o=null;return ;} int mid=(l+r)/2; o=new Node(); o->v=mid; build(o->ch[0],l,mid-1); build(o->ch[1],mid+1,r); o->maintain();}void print(Node* o){ if(o!=null) { o->pushdown(); print(o->ch[0]); if(o->v>1) printf("%d\n",o->v-1); print(o->ch[1]); }}void debug(Node* o,int f){ if(o!=null) { o->pushdown(); debug(o->ch[0],o->v); printf("%d %d %d\n",o->v,f,o->s); debug(o->ch[1],o->v); }}void remove(Node* o){ if(o->ch[0]!=NULL) remove(o->ch[0]); if(o->ch[1]!=NULL) remove(o->ch[1]); delete o; o=NULL;}Node* root;int main(){ int n,m; scanf("%d%d",&n,&m); build(root,1,n+1);//建树时节点加一// debug(root,-1);cout<<endl; while(m--) { int a,b; scanf("%d%d",&a,&b); Node *left,*mid,*right,*o; split(root,a,left,o); split(o,b-a+1,mid,right); mid->flip^=1; root=merge(merge(left,right),mid);// debug(root,-1);cout<<endl; } print(root); return 0;}
0 0
- UVA 11922 Permutation Transformer(splay树)
- UVA 11922 Permutation Transformer Splay
- UVA 11922 Permutation Transformer(splay)
- UVa 11922 Permutation Transformer(splay)
- Permutation Transformer+uva+splay树
- UVA 11922 Permutation Transformer(伸展树 Splay Tree)
- 【splay tree】 UVA 11922 Permutation Transformer
- UVa 11922 - Permutation Transformer (Splay)
- UVA 11922 Permutation Transformer(Splay Tree)
- uva 11922 Permutation Transformer(Splay tree,懒标记传递)
- UVA 11922 Permutation Transformer Splay 区间翻转 + 区间合并
- UVA 11922 Permutation Transformer (Splay 区间翻转 + 复制粘贴)
- UVA 11922 Permutation Transformer(Splay【伸展树】的一些操作)
- uva 11922 - Permutation Transformer
- uva 11922 Permutation Transformer
- UVA 11922 Permutation Transformer 伸展树
- 【UVA】11922 Permutation Transformer 伸展树
- uva 11922 - Permutation Transformer(伸展树)
- CSS 1 初识
- Java String类
- MOOC 数据结构 Pop Sequence
- 2016-10-29 程序举例
- Java StringBuffer和StringBuilder类
- UVA 11922 Permutation Transformer(splay树)
- Android MessageQueen详解
- 7. GStreamer建议的学习步骤和网页链接汇总
- Java 数组
- this is the first time to use this.
- 环信即时通讯sdk使用时遇到的问题及解决
- 413. Arithmetic Slices
- Codves 1044 拦截导弹 ---1999年NOIP全国联赛提高组 dp(n2 || nlogn)
- C# WinForm窗体及其控件的自适应