题目描述 Description

给出N个数,要求做M次区间翻转(如1 2 3 4变成4 3 2 1),求出最后的序列

输入描述 Input Description

第一行一个数N,下一行N个数表示原始序列,在下一行一个数M表示M次翻转,之后的M行每行两个数L,R表示将区间[L,R]翻转。

输出描述 Output Description

一行N个数 , 表示最终序列。

样例输入 Sample Input

4

1 2 3 4

2

1 2

3 4

样例输出 Sample Output

2 1 4 3

数据范围及提示 Data Size & Hint

对于30%的数据满足n<=100 , m <= 10000

对于100%的数据满足n <= 150000 , m <= 150000

对于100%的数据满足n为2的幂,且L = i * 2^j + 1 , R = (i + 1) * 2^j

最初自己写了一个,然后怎么调也调不出来,明天再战:

#include<cstdio>
#include<iostream>
#define N 150010
using namespace std;
int son[N][],fa[N],val[N],order[N],rev[N],sz[N],n,m,rt,size;
void pushup(int x){
if(!x)return;
sz[x]=sz[son[x][]]+sz[son[x][]]+;
}
void pushdown(int x){
swap(son[x][],son[x][]);
rev[son[x][]]^=;rev[son[x][]]^=;
rev[x]^=;
}
void rotate(int x,int &k){
int y=fa[x],z=fa[y],l,r;
if(son[y][]==x)l=;else l=;r=l^;
if(y==k)k=x;
else {
if(son[z][]==y) son[z][]=x;
else son[z][]=x;
}
fa[x]=z;fa[y]=x;fa[son[x][r]]=y;
son[y][l]=son[x][r];son[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((son[y][]==x)^(son[z][]==y)) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
void insert(int hao,int v){
int k=rt,y=;
while(k)y=k,k=son[k][hao>order[k]];
k=++size;fa[k]=y;son[y][v>order[y]]=k;val[k]=v;order[k]=hao;sz[k]=;
splay(k,rt);
}
int find(int x){
int k=rt;
while(){
if(rev[k])pushdown(k);
if(sz[son[k][]]+==x)return k;
if(sz[son[k][]]>=x) k=son[k][];
else x-=(sz[son[k][]]+),k=son[k][];
}
}
void rever(int x,int y){
if(x==&&y==n)rev[rt]^=;
if(x==&&y<n){
int p=find(y+);
splay(p,rt);rev[son[rt][]]^=;
}
if(y==n&&x>){
int p=find(x-);
splay(p,rt);rev[son[rt][]]^=;
}
if(x>&&y<n){
int p;
p=find(x-);splay(p,rt);
p=find(y+);splay(p,son[rt][]);
rev[son[son[rt][]][]]^=;
}
}
void dfs(int k){
if(!k)return;
if(rev[k])pushdown(k);
dfs(son[k][]);
printf("%d ",val[k]);
dfs(son[k][]);
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
int x;scanf("%d",&x);
insert(i,x);
}
scanf("%d",&m);
for(int i=;i<=m;i++){
int x,y;scanf("%d%d",&x,&y);
//if(i==1)continue;
rever(x,y);
}
dfs(rt);
return ;
}

比着黄学长写了一个:

#include<cstdio>
#include<iostream>
#define N 150010
using namespace std;
int fa[N],son[N][],id[N],sz[N],rev[N],val[N];
int n,m,size,rt;
void pushup(int k){
int l=son[k][],r=son[k][];
sz[k]=sz[l]+sz[r]+;
}
void pushdown(int k){
int l=son[k][],r=son[k][];
if(rev[k]){
swap(son[k][],son[k][]);
rev[l]^=;rev[r]^=;
rev[k]=;
}
}
void rotate(int x,int &k){
int y=fa[x],z=fa[y],l,r;
if(son[y][]==x)l=;else l=;r=l^;
if(y==k)k=x;
else {
if(son[z][]==y) son[z][]=x;
else son[z][]=x;
}
fa[x]=z;fa[y]=x;fa[son[x][r]]=y;
son[y][l]=son[x][r];son[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((son[y][]==x)^(son[z][]==y)) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
int find(int k,int rank){
pushdown(k);
int l=son[k][],r=son[k][];
if(sz[l]+==rank)return k;
else if(sz[l]>=rank) return find(l,rank);
else return find(r,rank-sz[l]-);
}
void rever(int l,int r){
int x=find(rt,l),y=find(rt,r+);
splay(x,rt);splay(y,son[x][]);
int z=son[y][];rev[z]^=;
}
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;sz[now]=;
if(l<f)son[last][]=now;
else son[last][]=now;
return;
}
int mid=l+r>>;now=id[mid];
build(l,mid-,mid);build(mid+,r,mid);
fa[now]=last;pushup(mid);
if(mid<f)son[last][]=now;
else son[last][]=now;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n+;i++)
id[i]=++size;
val[]=-0x7fffffff;val[n+]=0x7fffffff;
for(int i=;i<=n+;i++)
scanf("%d",&val[i]);
build(,n+,);rt=(n+)>>;
scanf("%d",&m);
for(int i=;i<=m;i++){
int l,r;scanf("%d%d",&l,&r);
rever(l,r);
}
for(int i=;i<=n+;i++)
printf("%d ",val[find(rt,i)]);
return ;
}

最新文章

  1. Python爬虫:Xpath语法笔记
  2. AutoCAD学习笔记
  3. jquery------.resizable()的使用
  4. 键盘--android 隐藏系统键盘
  5. eclipse下使用API操作HDFS
  6. UI进阶 SQLite错误码
  7. java socket nio编程
  8. Unity 5.x---00使用重力
  9. Python学习入门基础教程(learning Python)--8.3 字典常用的方法函数介绍
  10. Oracle 的一张表没有主键,如何映射Hibernate
  11. GDAL 2.0版本RPC校正速度测试
  12. golang 中strconv包用法
  13. 关于crontab
  14. windows 解放鼠标快捷键
  15. java 工具
  16. [UE4]Tree View
  17. ORA-01654 : 表空间不足
  18. 上传文件时form表单需要添加的属性
  19. WPF中的动画——(六)演示图板
  20. sar 命令

热门文章

  1. codevs 1146 ISBN号码
  2. JAVA 数据库编程中的性能优化
  3. APPScan-简单操作流程
  4. 五、Pandas玩转数据
  5. hash 散列表
  6. C++11:移动构造函数的测试
  7. Web性能优化系列:10个JavaScript性能提升的技巧
  8. java运行环境jdk的安装和环境变量的配置教程
  9. 前端vue 里的tab切换 减少dom操作
  10. Python中读取txt文本出现:SyntaxError: (unicode error) &#39;unicodeescape&#39; codec can&#39;t decode bytes in position 2-3: truncated \UXXXXXXXX escape问题解决