bzoj 3223 splay 解题报告
来源:互联网 发布:哈登数据库 编辑:程序博客网 时间:2024/05/18 02:41
文艺平衡树
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 4585 Solved: 2676
[Submit][Status][Discuss]
Description
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1
题解
splay,用一个标记来表示是否翻转了。
代码
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;inline int read(){ int x=0,f=1;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;}int n,m,sz,rt,fa[100005],c[100005][2],id[100005],size[100005];bool rev[100005];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[1]^=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^=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(); for(int i=1;i<=n+2;i++) id[i]=++sz; build(1,n+2,0);rt=(n+3)>>1; for(int i=1;i<=m;i++) { int l=read(),r=read(); rever(l,r); } for(int i=2;i<=n+1;i++) printf("%d ",find(rt,i)-1); return 0;}
阅读全文
2 0
- bzoj 3223 splay 解题报告
- BZOJ 3223 Splay 解题报告
- BZOJ 1269 [AHOI 2006] STL(rope)\SPLAY 解题报告
- bzoj 3223(splay)
- BZOJ 1588 TREAP 解题报告
- BZOJ 3224 TREAP 解题报告
- BZOJ 1820 DP 解题报告
- BZOJ 2144 LCA 解题报告
- BZOJ 4152 博弈论 解题报告
- BZOJ 1566 DP 解题报告
- BZOJ 3119 贪心 解题报告
- bzoj 1036 树链剖分 解题报告
- bzoj 3696 化合物 解题报告
- BZOJ 2563 贪心 解题报告
- BZOJ 3790 Manacher 解题报告
- BZOJ 2160 Manacher 解题报告
- BZOJ 2038 莫队 解题报告
- BZOJ 3687 bitset 解题报告
- session失效后跳转到登陆页面
- 编程之美2.6 精确表达浮点数
- Dalvik虚拟机学习1——Dalvik虚拟机源码结构分析
- linux下安装composer以及使用composer安装laravel
- kNN近邻算法改善约会网站配对效果案例
- bzoj 3223 splay 解题报告
- myeclipse中快捷键
- 远程数据库备份到本地(本地无数据库)
- sql中exists,not exists的用法
- 单元测试Mock使用方法
- uC/OS-III之定时器管理
- 斐波那契数列问题汇总
- java word转pdf的几种方法
- Linux IPC通信方式