BZOJ Tyvj 1729 文艺平衡树
2016-01-17 22:03
246 查看
Description
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1Input
第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n) m表示翻转操作次数接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n
Output
输出一行n个数字,表示原始序列经过m次变换后的结果Sample Input
5 31 3
1 3
1 4
Sample Output
4 3 2 1 5HINT
N,M<=100000序列翻转裸题。。。又是裸题
#include<iostream> #include<cstdio> using namespace std; int n,m,sz,rt; int fa[100005],c[100005][2],id[100005]; int 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 rotate(int x,int &k){ int y=fa[x],z=fa[y],l,r; l=(c[y][1]==x); r=l^1; if (k==y) k=x; else c[z][c[z][1]==y]=x; fa[c[x][r]]=y;fa[y]=x;fa[x]=z; 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); } } 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; } } int find(int k,int rk){ pushdown(k); int l=c[k][0],r=c[k][1]; if(size[l]+1==rk) return k; if (size[l]>=rk) return find(l,rk); return find(r,rk-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[mid]=last;pushup(mid); c[last][mid>=f]=now; } int main(){ scanf("%d%d",&n,&m); 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,r; scanf("%d%d",&l,&r); rever(l,r); } for (int i=2;i<=n+1;i++) printf("%d ",find(rt,i)-1); }
相关文章推荐
- C#窗体自适应
- C#中的泛型
- 一起学CC3200之开发环境简介(2)烧录程序
- MATLAB向txt连续写入数据
- Spring注解@Component、@Repository、@Service、@Controlle
- 用adt-bundle-windows搭建Android开发环境
- rqnoj jam计数法
- Android笔记--对同步与异步的概念上的理解和对LayoutParams的理解
- Android-Uiautomator:[6]运行中传入参数
- Scala-01:函数定义、流程控制、异常处理
- Delphi 全面控制Windows任务栏
- 【UVA】12299-RMQ with Shifts(线段树)
- BZOJ 1507 [NOI2003]Editor
- MongoDB数据存储结构
- HDOJ 2710 Max Factor (筛素法求最大因子)
- db_oracle_account_01
- 犀牛书随手记-05
- 問題排查:建立選單時的錯誤 errcode:40016, errmsg:invalid button size hint: [RI68La0851vr18]
- 使用服务开启关闭暂停音乐
- POJ 2676/2918 数独(dfs)