[BZOJ]3223: Tyvj 1729 文艺平衡树
来源:互联网 发布:tomcat怎么配置数据库 编辑:程序博客网 时间:2024/06/05 05:09
3223: Tyvj 1729 文艺平衡树
Description
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1
Input
第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n) m表示翻转操作次数
接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n
Output
输出一行n个数字,表示原始序列经过m次变换后的结果
Sample Input
5 3
1 3
1 3
1 4
Sample Output
4 3 2 1 5
HINT
N,M<=100000
Source
平衡树
来水一发无旋Treap
#include <cstdio>#include <cstdlib>#include <algorithm>using namespace std;typedef pair<int,int> P;inline char tc(void){ static char fl[1000000],*A=fl,*B=fl; return A==B&&(B=(A=fl)+fread(fl,1,1000000,stdin),A==B)?EOF:*A++;}inline int read(void){ int a=0;static char c; while((c=tc())<'0'||c>'9'); while(c>='0'&&c<='9') a=a*10+c-'0',c=tc(); return a;}struct Treap{ int l,r,size,random; bool rev;}tree[100002];int n,m,root;P x,y;void update(int x){ tree[x].size=1; if(tree[x].l) tree[x].size+=tree[tree[x].l].size; if(tree[x].r) tree[x].size+=tree[tree[x].r].size; return ;}void pushdown(int x){ if(tree[x].l) tree[tree[x].l].rev^=1; if(tree[x].r) tree[tree[x].r].rev^=1; tree[x].rev=0,swap(tree[x].l,tree[x].r); return ;}int merge(int u,int v){ if(!u||!v) return u^v; if(tree[u].rev) pushdown(u); if(tree[v].rev) pushdown(v); if(tree[u].random<tree[v].random) { tree[u].r=merge(tree[u].r,v),update(u); return u; } tree[v].l=merge(u,tree[v].l),update(v); return v;}P split(int x,int n){ if(!n) return P(0,x); if(tree[x].rev) pushdown(x); if(n<=tree[tree[x].l].size) { P f=split(tree[x].l,n); tree[x].l=f.second, update(x); return P(f.first,x); } P f=split(tree[x].r,n-tree[tree[x].l].size-1); tree[x].r=f.first; update(x); return P(x,f.second);}void pri(int x){ if(tree[x].rev) pushdown(x); if(tree[x].l) pri(tree[x].l); printf("%d ",x); if(tree[x].r) pri(tree[x].r); return ;}int main(void){ register int i,ql,qr; n=read(),m=read(); for (i=1;i<=n;++i) tree[i].size=1,tree[i].random=rand(),root=merge(root,i); for (i=1;i<=m;++i) { ql=read(),qr=read(); x=split(root,ql-1); y=split(x.second,qr-ql+1); int x1=x.first,x2=x.second,y1=y.first,y2=y.second; tree[y.first].rev^=1; root=merge(x.first,merge(y.first,y.second)); } pri(root); return 0;}
阅读全文
0 0
- 【BZOJ 3223】 Tyvj 1729 文艺平衡树
- bzoj 3223: Tyvj 1729 文艺平衡树
- bzoj 3223: Tyvj 1729 文艺平衡树
- BZOJ 3223: Tyvj 1729 文艺平衡树
- BZOJ 3223 Tyvj 1729 文艺平衡树
- BZOJ 3223 Tyvj 1729 文艺平衡树
- BZOJ 3223: Tyvj 1729 文艺平衡树
- 【bzoj 3223】Tyvj 1729 文艺平衡树
- [BZOJ]3223: Tyvj 1729 文艺平衡树
- BZOJ 3223: Tyvj 1729 文艺平衡树
- 平衡树模板&&bzoj 3223&&Tyvj 1729 文艺平衡树
- 【BZOJ】Tyvj 1729 文艺平衡树 Splay
- [SPLAY维护区间][BZOJ 3223][TYVJ 1729]文艺平衡树
- bzoj 3223/tyvj 1729 文艺平衡树 splay tree
- bzoj 3223 Tyvj 1729 文艺平衡树 Splay
- bzoj 3223 Tyvj 1729 文艺平衡树 [Splay]
- Bzoj 3223: Tyvj 1729 文艺平衡树(splay)
- [BZOJ 3223]Tyvj 1729 文艺平衡树(Splay)
- dedecms怎样设置不同的搜索页模板
- MySQL 创建数据表
- 用指针实现 strcat()字符串追加
- 胜者树 败者树
- Java练习 输出1到10的阶乘的和 回文数 简易菜单 个人所得税
- [BZOJ]3223: Tyvj 1729 文艺平衡树
- 生日计算函数
- No inverse field None found for 'res.users' ?
- 第八天java笔记
- Java语法之面向对象
- touches,targetTouches,changedTouches
- 编写函数实现strcat(),strcmp()以及strcpy()的功能
- pat-basic-1004-c语言
- 初识Ajax