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

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

  1. #include<cstdio>
  2. #include<iostream>
  3. #define N 150010
  4. using namespace std;
  5. int son[N][],fa[N],val[N],order[N],rev[N],sz[N],n,m,rt,size;
  6. void pushup(int x){
  7. if(!x)return;
  8. sz[x]=sz[son[x][]]+sz[son[x][]]+;
  9. }
  10. void pushdown(int x){
  11. swap(son[x][],son[x][]);
  12. rev[son[x][]]^=;rev[son[x][]]^=;
  13. rev[x]^=;
  14. }
  15. void rotate(int x,int &k){
  16. int y=fa[x],z=fa[y],l,r;
  17. if(son[y][]==x)l=;else l=;r=l^;
  18. if(y==k)k=x;
  19. else {
  20. if(son[z][]==y) son[z][]=x;
  21. else son[z][]=x;
  22. }
  23. fa[x]=z;fa[y]=x;fa[son[x][r]]=y;
  24. son[y][l]=son[x][r];son[x][r]=y;
  25. pushup(y);pushup(x);
  26. }
  27. void splay(int x,int &k){
  28. while(x!=k){
  29. int y=fa[x],z=fa[y];
  30. if(y!=k){
  31. if((son[y][]==x)^(son[z][]==y)) rotate(x,k);
  32. else rotate(y,k);
  33. }
  34. rotate(x,k);
  35. }
  36. }
  37. void insert(int hao,int v){
  38. int k=rt,y=;
  39. while(k)y=k,k=son[k][hao>order[k]];
  40. k=++size;fa[k]=y;son[y][v>order[y]]=k;val[k]=v;order[k]=hao;sz[k]=;
  41. splay(k,rt);
  42. }
  43. int find(int x){
  44. int k=rt;
  45. while(){
  46. if(rev[k])pushdown(k);
  47. if(sz[son[k][]]+==x)return k;
  48. if(sz[son[k][]]>=x) k=son[k][];
  49. else x-=(sz[son[k][]]+),k=son[k][];
  50. }
  51. }
  52. void rever(int x,int y){
  53. if(x==&&y==n)rev[rt]^=;
  54. if(x==&&y<n){
  55. int p=find(y+);
  56. splay(p,rt);rev[son[rt][]]^=;
  57. }
  58. if(y==n&&x>){
  59. int p=find(x-);
  60. splay(p,rt);rev[son[rt][]]^=;
  61. }
  62. if(x>&&y<n){
  63. int p;
  64. p=find(x-);splay(p,rt);
  65. p=find(y+);splay(p,son[rt][]);
  66. rev[son[son[rt][]][]]^=;
  67. }
  68. }
  69. void dfs(int k){
  70. if(!k)return;
  71. if(rev[k])pushdown(k);
  72. dfs(son[k][]);
  73. printf("%d ",val[k]);
  74. dfs(son[k][]);
  75. }
  76. int main(){
  77. scanf("%d",&n);
  78. for(int i=;i<=n;i++){
  79. int x;scanf("%d",&x);
  80. insert(i,x);
  81. }
  82. scanf("%d",&m);
  83. for(int i=;i<=m;i++){
  84. int x,y;scanf("%d%d",&x,&y);
  85. //if(i==1)continue;
  86. rever(x,y);
  87. }
  88. dfs(rt);
  89. return ;
  90. }

比着黄学长写了一个:

  1. #include<cstdio>
  2. #include<iostream>
  3. #define N 150010
  4. using namespace std;
  5. int fa[N],son[N][],id[N],sz[N],rev[N],val[N];
  6. int n,m,size,rt;
  7. void pushup(int k){
  8. int l=son[k][],r=son[k][];
  9. sz[k]=sz[l]+sz[r]+;
  10. }
  11. void pushdown(int k){
  12. int l=son[k][],r=son[k][];
  13. if(rev[k]){
  14. swap(son[k][],son[k][]);
  15. rev[l]^=;rev[r]^=;
  16. rev[k]=;
  17. }
  18. }
  19. void rotate(int x,int &k){
  20. int y=fa[x],z=fa[y],l,r;
  21. if(son[y][]==x)l=;else l=;r=l^;
  22. if(y==k)k=x;
  23. else {
  24. if(son[z][]==y) son[z][]=x;
  25. else son[z][]=x;
  26. }
  27. fa[x]=z;fa[y]=x;fa[son[x][r]]=y;
  28. son[y][l]=son[x][r];son[x][r]=y;
  29. pushup(y);pushup(x);
  30. }
  31. void splay(int x,int &k){
  32. while(x!=k){
  33. int y=fa[x],z=fa[y];
  34. if(y!=k){
  35. if((son[y][]==x)^(son[z][]==y)) rotate(x,k);
  36. else rotate(y,k);
  37. }
  38. rotate(x,k);
  39. }
  40. }
  41. int find(int k,int rank){
  42. pushdown(k);
  43. int l=son[k][],r=son[k][];
  44. if(sz[l]+==rank)return k;
  45. else if(sz[l]>=rank) return find(l,rank);
  46. else return find(r,rank-sz[l]-);
  47. }
  48. void rever(int l,int r){
  49. int x=find(rt,l),y=find(rt,r+);
  50. splay(x,rt);splay(y,son[x][]);
  51. int z=son[y][];rev[z]^=;
  52. }
  53. void build(int l,int r,int f){
  54. if(l>r)return;
  55. int now=id[l],last=id[f];
  56. if(l==r){
  57. fa[now]=last;sz[now]=;
  58. if(l<f)son[last][]=now;
  59. else son[last][]=now;
  60. return;
  61. }
  62. int mid=l+r>>;now=id[mid];
  63. build(l,mid-,mid);build(mid+,r,mid);
  64. fa[now]=last;pushup(mid);
  65. if(mid<f)son[last][]=now;
  66. else son[last][]=now;
  67. }
  68. int main(){
  69. scanf("%d",&n);
  70. for(int i=;i<=n+;i++)
  71. id[i]=++size;
  72. val[]=-0x7fffffff;val[n+]=0x7fffffff;
  73. for(int i=;i<=n+;i++)
  74. scanf("%d",&val[i]);
  75. build(,n+,);rt=(n+)>>;
  76. scanf("%d",&m);
  77. for(int i=;i<=m;i++){
  78. int l,r;scanf("%d%d",&l,&r);
  79. rever(l,r);
  80. }
  81. for(int i=;i<=n+;i++)
  82. printf("%d ",val[find(rt,i)]);
  83. return ;
  84. }

区间翻转(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. Jquery 错误提示插件

    这是一个简单的输入框错误提示插件,可拓展! .jq-error{ font-size:12px; min-width:150px; width:auto; max-width:350px; line- ...

  2. initWithNibName/awakeFromNib/initWithCoder

    转自: http://leeyin.iteye.com/blog/1040362 每个ios开发者对loadView和viewDidLoad肯定都很熟悉,虽然这两个函数使用上真的是非常简单,但是和类似 ...

  3. 基于Python的Web应用开发实战——2 程序的基本结构

    2.1 初始化 所有Flaks程序都必须创建一个程序实例. Web服务器使用一种名为Web服务器网关接口(Web Server Gateway Interface,WSGI)的协议,把接收自客户端的所 ...

  4. OpenCV2:介绍

    一.OpenCV简介 OpenCV所有的类和函数都在cv命名空间里面,可以用 using namespace cv; #include "opencv2/opencv.hpp" 1 ...

  5. Django-C001-快速入门

    此文章完成度[100%]留着以后忘记的回顾.多写多练多思考,我会努力写出有意思的demo,如果知识点有错误.误导,欢迎大家在评论处写下你的感想或者纠错. Django Django是一个开放源码的We ...

  6. CS193p Lecture 6 - UINavigation, UITabBar

    抽象类(Abstract):指的是这个类不能被实例化,只能被继承: OC中没有关键词来标明某个类是抽象类,只能在注释中标注一下: 抽象类中的抽象方法,必须是public的,使方法称为public的方法 ...

  7. java获取本地计算机MAC地址

    java获取本地计算机MAC地址代码如下: public class SocketMac { //将读取的计算机MAC地址字节转化为字符串 public static String transByte ...

  8. 如何用纯 CSS 创作一个均衡器 loader 动画

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oybWBy 可交互视频教 ...

  9. FIFO设计思考之一

    不管同步FIFO还是异步FIFO,设计难点是full/empty状态flag的正确性. 要保证任何情况 FULL时NO WRITE,EMPTY时NO READ.overflow / underflow ...

  10. 【php】 php 的注释和结束符号之间的关系

    Closing PHP tags are recognised within single-line comments: <?php    // Code will end here ?> ...