题目描述 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 ;
}

区间翻转(codevs 3243)的更多相关文章

  1. [BZOJ 3223 & Tyvj 1729]文艺平衡树 & [CodeVS 3243]区间翻转

    题目不说了,就是区间翻转 传送门:BZOJ 3223 和 CodeVS 3243 第一道题中是1~n的区间翻转,而第二道题对于每个1~n还有一个附加值 实际上两道题的思路是一样的,第二题把值对应到位置 ...

  2. WIKIOI 3243 区间翻转

    3243 区间翻转 题目描述 Description 给出N个数,要求做M次区间翻转(如1 2 3 4变成4 3 2 1),求出最后的序列 输入描述 Input Description 第一行一个数N ...

  3. CODEVS 4655 序列终结者-splay(区间更新、区间翻转、区间最值)

    4655 序列终结者  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Description 网上有许多题,就是给定一个序列,要 ...

  4. codevs3243 区间翻转

    题目描述 Description 给出N个数,要求做M次区间翻转(如1 2 3 4变成4 3 2 1),求出最后的序列 输入描述 Input Description 第一行一个数N,下一行N个数表示原 ...

  5. hdu-3487-Play with Chain-(splay 区间翻转,切割,插入)

    题意: 区间翻转,切割,插入 // File Name: ACM/HDU/3487.cpp // Author: Zlbing // Created Time: 2013年08月10日 星期六 21时 ...

  6. hdu-1890-Robotic Sort splay区间翻转

    题意: 依次找第i大的数下标pos[i],然后将区间[i,pos[i]]翻转 分析: splay树区间翻转 // File Name: ACM/HDU/1890.cpp // Author: Zlbi ...

  7. bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2202  Solved: 1226[Submit][Sta ...

  8. [置顶] hdu 1890 伸展树区间翻转

    题意: 给你n个数,每次先输出第i大的数的位置(如果有多个,选下标小的那个),然后每次将第i个位置到第i大的数所在位置之间的数进行翻转. 思路:输入的数组可能有多个相同的值,我们可以进行两次排序把数组 ...

  9. hdu3397区间覆盖,区间翻转,区间合并,区间求和

    调了很久的代码..注意区间翻转和覆盖的操作互相的影响 /* 区间替换操作怎么搞? 应该是加个tag标记 如果整个区间都是0|1,那么把若有tag的话直接set1|0即可,也不用设置tag标记 反之要设 ...

随机推荐

  1. Spring IOC的Bean对象

    ---恢复内容开始--- 在Spring IOC模块中Bean是非常重要的.在这里我想给大家讲讲关于Bean对象实例化的三种注入方式: 首先,我先讲一下关于Bean对象属性值的两种注入方式:set注入 ...

  2. bzoj 2658

    首先考虑容斥 我们计算出所有没有点在其中的矩形,然后用所有矩形减去这些矩形即可 然后考虑如何计算没有点在其中的矩形 采用扫描线的思想,从上向下一行一行扫,假设我们扫到的行编号是$a$,然后考虑如果左右 ...

  3. c语言实验7 文件

    part 1 验证性实验 验证性实验1 验证性实验2:已知文本数据文件file1.dat,从中读取数据,找出最高分和最低分学生信息,并输入在屏幕上. 运行结果如下图: #include <std ...

  4. C程序(2)

     

  5. javaEE(3)_servlet基础

    一.Servlet简介 1.Servlet是sun公司提供的一门用于开发动态web资源的技术,Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序 ...

  6. 【最短路径树】51nod1443 路径和树

    并不是什么高端操作并且一些模型会用到 Description 给定一幅无向带权连通图G = (V, E) (这里V是点集,E是边集).从点u开始的最短路径树是这样一幅图G1 = (V, E1),其中E ...

  7. 【Java_多线程并发编程】JUC原子类——4种原子类

    根据修改的数据类型,可以将JUC包中的原子操作类可以分为4种,分别是: 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: Atom ...

  8. CentOS6.5卸载openJDK和安装Sun JDK

    CentOS6.5卸载openJDK和安装Sun JDK 最近业务需要,新安装了CentOS6.5系统,在配置tomcat的时候,总是报错找不到jdk中的java.研究了半天,发现应该是openJDK ...

  9. Linux系统状态检测

    基于Red Hat Enterprise Linux 7.5 1.ifconfig ifconfig用于获取和配置网络接口的网络参数,格式为“ifconfig [网络设备] [参数]” 参数: add ...

  10. CSS3-::selection

    “::selection”只能设置两个属性,一个就是background,另一个就是color属性,设置其他属性是没有任何效果的. ::selection使用语法: /*Webkit,Opera9.5 ...