splay模板(洛谷3391,BZOJ3223)
来源:互联网 发布:大学生表白知乎 编辑:程序博客网 时间:2024/06/06 17:22
题目
题目传送门
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
code
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<algorithm>#define rep(i,a,b) for(int i=a;i<=b;i++)#define dep(i,a,b) for(int i=a;i>=b;i--)#define ll long long#define mem(x,num) memset(x,num,sizeof x)using namespace std;inline ll read(){ ll f=1,x=0;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}const int maxn=1e5+6;int n,m,sz,rt,fa[maxn],c[maxn][2],id[maxn],size[maxn];bool rev[maxn];void pushup(int k){ int l=c[k][0],r=c[k][1]; size[k]=size[l]+size[r]+1;}void pushdown(int k){ int l=c[k][0],r=c[k][1]; if(rev[k]){ swap(c[k][0],c[k][1]); rev[l]^=1;rev[r]^=1; rev[k]=0; }}void rotate(int x,int &k){ int y=fa[x],z=fa[y],l,r; if(c[y][0]==x)l=0;else l=1; r=l^1; if(y==k)k=x; else{ if(c[z][0]==y)c[z][0]=x; else c[z][1]=x; } fa[x]=z;fa[y]=x;fa[c[x][r]]=y; c[y][l]=c[x][r];c[x][r]=y; pushup(y);pushup(x);}void splay(int x,int &k){ while(x!=k){ int y=fa[x],z=fa[y]; if(y!=k){ if(c[y][0]==x^c[z][0]==y)rotate(x,k); else rotate(y,k); } rotate(x,k); }}int find(int k,int rank){ pushdown(k); int l=c[k][0],r=c[k][1]; if(size[l]+1==rank)return k; else if(size[l]>=rank)return find(l,rank); else return find(r,rank-size[l]-1);}void rever(int l,int r){ int x=find(rt,l),y=find(rt,r+2); splay(x,rt);splay(y,c[x][1]); int z=c[y][0]; rev[z]^=1;}void build(int l,int r,int f){ if(l>r)return; int now=id[l],last=id[f]; if(l==r){ fa[now]=last;size[now]=1; if(l<f)c[last][0]=now; else c[last][1]=now; return; } int mid=(l+r)>>1;now=id[mid]; build(l,mid-1,mid);build(mid+1,r,mid); fa[now]=last;pushup(mid); if(mid<f)c[last][0]=now; else c[last][1]=now;}int main(){ n=read(),m=read(); rep(i,1,n+2)id[i]=++sz; build(1,n+2,0);rt=(n+3)>>1; rep(i,1,m){ int l=read(),r=read(); rever(l,r); } rep(i,2,n+1)printf("%d ",find(rt,i)-1); return 0;}
阅读全文
0 0
- splay模板(洛谷3391,BZOJ3223)
- Splay模板[POJ2761]+[BZOJ3223]+[BZOJ3224]
- BZOJ3223&3224 文艺&普通平衡树 Splay模板(数组)
- splay 新模板 【bzoj3223】 文艺平衡树
- bzoj3223[Tyvj 1729] 文艺平衡树(splay模板题:区间翻转)
- BZOJ3223 文艺平衡树(Splay)
- [BZOJ3223]文艺平衡树(平衡树splay)
- [BZOJ3223]文艺平衡树(平衡树splay)
- [BZOJ3223] 文艺平衡树 - splay
- [BZOJ3223]文艺平衡树 splay
- bzoj3223文艺平衡树splay
- Luogu-3391 (splay模板)
- bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)
- 【bzoj3223】文艺平衡树【Splay】【呵呵】
- 【bzoj3223】Tyvj 1729 文艺平衡树 Splay
- 【BZOJ3223】文艺平衡树,Splay反转区间
- bzoj3223 文艺平衡树 Splay & Treap
- 【BZOJ3223】Tyvj 1729 文艺平衡树【Splay】
- java统一异常处理总结
- 2019第五届中东(阿布扎比)国际海事防务展
- hibernate的主键和复合主键
- 安装使用MySQL-Proxy
- 把文字写到视频上
- splay模板(洛谷3391,BZOJ3223)
- UILable不同版中的lineBreakMode
- js 判断客户端和手机端
- GStreamer学习计划
- Win10下python3和python2同时安装并解决pip共存问题
- 汇编入门-基础知识
- C冒泡排序
- JDBC规范——(1)前言
- 2018千锋HTML5视频教程全集学习知识点精选:Bootstrap框架技术