[bzoj3223]文艺平衡树
2016-04-06 20:02
281 查看
题目大意
维护序列。需要兹瓷区间翻转。
treap大法好
嘿嘿嘿裸题。注意遍历treap的时候也要down标记啊!
#include<cstdio> #include<algorithm> #define fo(i,a,b) for(i=a;i<=b;i++) using namespace std; const int maxn=100000+10; int left[maxn],right[maxn],key[maxn],fix[maxn],size[maxn],sta[maxn]; bool rev[maxn]; int i,j,k,l,r,mid,t,n,m,top,root,cnt; int rand() { static int rand_seed=1542071823; rand_seed+=rand_seed<<1|1; return rand_seed; } void update(int x){ size[x]=size[left[x]]+size[right[x]]+1; } void solve(int x){ if (!x) return; solve(left[x]); solve(right[x]); update(x); } void mark(int x){ rev[x]^=1; } void down(int x){ if (rev[x]){ if (left[x]) mark(left[x]); if (right[x]) mark(right[x]); swap(left[x],right[x]); rev[x]=0; } } void split(int x,int y,int &l,int &r){ if (!x){ l=r=0; return; } down(x); if (size[left[x]]+1<=y){ split(right[x],y-size[left[x]]-1,l,r); right[x]=l; update(x); l=x; } else{ split(left[x],y,l,r); left[x]=r; update(x); r=x; } } void merge(int l,int r,int &x){ if (!l||!r){ x=l+r; return; } down(l); down(r); if (fix[l]<fix[r]){ merge(right[l],r,right[l]); x=l; } else{ merge(l,left[r],left[r]); x=r; } update(x); } void travel(int x){ if (!x) return; down(x); travel(left[x]); cnt++; printf("%d",key[x]); if (cnt<n) printf(" "); travel(right[x]); } int main(){ //freopen("3223.in","r",stdin);freopen("3223.out","w",stdout); scanf("%d%d",&n,&m); fo(i,1,n){ key[i]=i; fix[i]=rand(); j=0; while (top&&fix[i]<fix[sta[top]]){ right[sta[top]]=j; j=sta[top]; left[i]=sta[top]; top--; } if (top) right[sta[top]]=i; sta[++top]=i; } root=sta[1]; solve(root); while (m--){ scanf("%d%d",&j,&k); split(root,k,l,r); split(l,j-1,l,mid); mark(mid); merge(l,mid,l); merge(l,r,root); } cnt=0; travel(root); }
相关文章推荐
- ExtJS之基本概念、环境搭建
- 第五周项目4-立方柱类的计算
- Android xml资源文件中@、@android:type、@*、?、@+含义和区别
- Vijos:P1234口袋的天空
- 2005
- 3
- 回调函数解析
- 图标
- Ubuntu下安装boost库
- js拖拽(二)仿iGoogle自定义首页模块拖拽
- [4] OFDM符号的生成与解析
- 《软件架构设计》学习笔记--7--6大步骤3:确定关键需求
- 4、Centos 6.4源码安装mysql-5.6.28.tar.gz
- PAT BASIC 1004
- SetBkMode可设置文字背景色:TRANSPARENT或OPAQUE
- 3.26 三一 F CodeForces 271A 新年 暴力 签到T
- LeetCode--Minimum Depth of Binary Tree
- C语言的知识与能力的自评
- View加载详解(二)
- C++命名空间理解