3243 区间翻转

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

题解:

要不要这么卡时啊。。。不加inline就不能过?

代码:

  1. {$inline on}
  2. const maxn=+;
  3. var s,id,fa,a:array[..maxn] of longint;
  4. rev:array[..maxn] of boolean;
  5. c:array[..maxn,..] of longint;
  6. i,n,m,rt,x,y:longint;
  7. procedure swap(var x,y:longint);inline;
  8. var t:longint;
  9. begin
  10. t:=x;x:=y;y:=t;
  11. end;
  12.  
  13. procedure pushup(x:longint);inline;
  14. begin
  15. s[x]:=s[c[x,]]+s[c[x,]]+;
  16. end;
  17. procedure pushdown(x:longint);inline;
  18. var l,r:longint;
  19. begin
  20. l:=c[x,];r:=c[x,];
  21. if rev[x] then
  22. begin
  23. swap(c[x,],c[x,]);
  24. rev[l]:=not(rev[l]);
  25. rev[r]:=not(rev[r]);
  26. rev[x]:=false;
  27. end;
  28. end;
  29. procedure rotate(x:longint;var k:Longint);inline;
  30. var l,r,y,z:longint;
  31. begin
  32. y:=fa[x];z:=fa[y];
  33. if c[y,]=x then l:= else l:=;r:=l xor ;
  34. if y=k then k:=x else c[z,ord(c[z,]=y)]:=x;
  35. fa[x]:=z;fa[y]:=x;fa[c[x,r]]:=y;
  36. c[y,l]:=c[x,r];c[x,r]:=y;
  37. pushup(y);pushup(x);
  38. end;
  39. procedure splay(x:longint;var k:longint);inline;
  40. var y,z:longint;
  41. begin
  42. while x<>k do
  43. begin
  44. y:=fa[x];z:=fa[y];
  45. if y<>k then
  46. begin
  47. if (c[z,]=y) xor (c[y,]=x) then rotate(x,k)
  48. else rotate(y,k);
  49. end;
  50. rotate(x,k);
  51. end;
  52. end;
  53. function find(x,rank:longint):longint;inline;
  54. var l,r:longint;
  55. begin
  56. pushdown(x);l:=c[x,];r:=c[x,];
  57. if s[l]+=rank then exit(x)
  58. else if s[l]>=rank then exit(find(l,rank))
  59. else exit(find(r,rank-s[l]-));
  60. end;
  61. procedure rever(l,r:longint);inline;
  62. var x,y:longint;
  63. begin
  64. x:=find(rt,l);y:=find(rt,r+);
  65. splay(x,rt);splay(y,c[x,]);
  66. rev[c[y,]]:=not(rev[c[y,]]);
  67. end;
  68. procedure build(l,r,f:longint);inline;
  69. var mid,now,last:longint;
  70. begin
  71. if l>r then exit;
  72. now:=id[l];last:=id[f];
  73. if l=r then
  74. begin
  75. fa[now]:=last;s[now]:=;
  76. c[last,ord(l>f)]:=now;
  77. exit;
  78. end;
  79. mid:=(l+r)>>;
  80. build(l,mid-,mid);build(mid+,r,mid);
  81. now:=id[mid];pushup(mid);
  82. fa[now]:=last;
  83. c[last,ord(mid>f)]:=now;
  84. end;
  85. procedure init;
  86. begin
  87. readln(n);
  88. for i:= to n do read(a[i]);readln;
  89. readln(m);
  90. for i:= to n+ do id[i]:=i;
  91. build(,n+,);rt:=(n+)>>;
  92. end;
  93. procedure main;
  94. begin
  95. for i:= to m do
  96. begin
  97. readln(x,y);
  98. rever(x,y);
  99. end;
  100. for i:= to n+ do write(a[find(rt,i)-],' ');
  101. end;
  102. begin
  103. assign(input,'input.txt');assign(output,'output.txt');
  104. reset(input);rewrite(output);
  105. init;
  106. main;
  107. close(input);close(output);
  108. end.

WIKIOI 3243 区间翻转的更多相关文章

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

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

  2. 区间翻转(codevs 3243)

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

  3. codevs3243 区间翻转

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 转:如何取得Spring管理的bean

    原文链接:http://blog.csdn.net/a9529lty/article/details/42145545 1.servlet方式加载时,[web.xml] <servlet> ...

  2. 准备Activiti的开发环境

    1.创建项目

  3. 10_Jaxws使用自定义pojo发布服务

    [简述] 查询三天的天气信息(天气概况.日期.温度),测试jaxws是否支持自定义pojo发布服务. [开发过程] 服务端: 1.自定义pojo(天气概况.日期.温度) 2.开发SEI接口及实现类 3 ...

  4. C++ 中的类型转换机制详解

    Tips: This article based on Scott Meyers's <<Effective C++>> article 27: Minimize Castin ...

  5. normalize.css介绍

    Normalize.css 只是一个很小的CSS文件,但它在默认的HTML元素样式上提供了跨浏览器的高度一致性.相比于传统的CSS reset,Normalize.css是一种现代的.为HTML5准备 ...

  6. 解决IE6下Position:fixed问题(只用css)

    在IE6.0及以下版本的浏览器里是不支持position:fixed.而在IE7,IE8,firefox,opera,chrome都可以完美的支持此特性的.解决此问题的要点主要有: 1).容器要有一个 ...

  7. (转载)使用ADOConnet.BeginTrans后,出现错误提示:无法在此会话中启动更多的事务?

    Q: 三层结构,在服务器端使用adoconnection连接到sqlserver2000,然后想在 datasetprovider的beforupdaterecord中使用语句: try adocon ...

  8. 关于ASE日志空间示数不正常的解决办法

        最近某系统的ASE数据库出现了异常,经过各种努力,终于把数据库正常又起起来了.但是经过检查,发现在查看剩余日志空间的时候(sp_helpsegment 'logsegment'),发现显示出来 ...

  9. 自动寻路NavMesh

    步骤 1.创建地形 2.添加角色 3.创建多个障碍物,尽量摆放的复杂些,用来检测NavMesh的可用性和效率 4.选中地形,在Navigation窗口中,设置Navigation Static 5.依 ...

  10. tomcat 7 下添加 shared/lib 文件夹

    你打开tomcat7\conf\catalina.properties文件再打开tomcat5的,看完后, 你就知道了 tomcat 5.5.35 # # List of comma-separate ...