Description

您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1

Input

第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n)  m表示翻转操作次数
接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n

Output

输出一行n个数字,表示原始序列经过m次变换后的结果

Sample Input

5 3

1 3

1 3

1 4

Sample Output

4 3 2 1 5

HINT

N,M<=100000

板子啊,常规操作

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define MAXN (100000+10)
  5. using namespace std;
  6. int Father[MAXN];
  7. int Son[MAXN][];
  8. int Size[MAXN];
  9. int Smark[MAXN];
  10. int a[MAXN];
  11. int Key[MAXN];
  12. int Root;
  13. int n,m,l,r;
  14. int Get(int x)
  15. {
  16. return Son[Father[x]][]==x;
  17. }
  18.  
  19. void Update(int x)
  20. {
  21. Size[x]=Size[Son[x][]]+Size[Son[x][]]+;
  22. }
  23.  
  24. void Pushdown(int x)
  25. {
  26. if (x && Smark[x])
  27. {
  28. Smark[Son[x][]]^=;
  29. Smark[Son[x][]]^=;
  30. swap(Son[x][],Son[x][]);
  31. Smark[x]=;
  32. }
  33. }
  34.  
  35. void Rotate(int x)
  36. {
  37. Pushdown(Father[x]);
  38. Pushdown(x);
  39. int fa=Father[x];
  40. int fafa=Father[fa];
  41. int wh=Get(x);
  42.  
  43. Son[fa][wh]=Son[x][wh^];
  44. Father[fa]=x;
  45. if (Son[fa][wh]) Father[Son[fa][wh]]=fa;
  46.  
  47. Father[x]=fafa;
  48. Son[x][wh^]=fa;
  49. if (fafa) Son[fafa][Son[fafa][]==fa]=x;
  50.  
  51. Update(fa);
  52. Update(x);
  53. }
  54.  
  55. void Splay(int x,int tar)
  56. {
  57. for (int fa;(fa=Father[x])!=tar;Rotate(x))
  58. if (Father[fa]!=tar)
  59. Rotate(Get(fa)==Get(x)?fa:x);
  60. if (!tar) Root=x;
  61. }
  62.  
  63. void Build (int l,int r,int fa)
  64. {
  65. if (l>r) return;
  66. int mid=(l+r)/;
  67. if (mid<fa) Son[fa][]=mid;
  68. if (mid>fa) Son[fa][]=mid;
  69. Father[mid]=fa;
  70. Size[mid]=;
  71. Key[mid]=a[mid];
  72. if (l==r) return;
  73. Build(l,mid-,mid);
  74. Build(mid+,r,mid);
  75. Update(mid);
  76. }
  77.  
  78. int Findx(int x)
  79. {
  80. int now=Root;
  81. while ()
  82. {
  83. Pushdown(now);
  84. if (x<=Size[Son[now][]])
  85. now=Son[now][];
  86. else
  87. {
  88. x-=Size[Son[now][]];
  89. if (x==) return now;
  90. x-=;
  91. now=Son[now][];
  92. }
  93. }
  94. }
  95.  
  96. void Rever(int l,int r)
  97. {
  98. int f1=Findx(l);
  99. int f2=Findx(r+);
  100. Splay(f1,);
  101. Splay(f2,f1);
  102. Smark[Son[Son[Root][]][]]^=;
  103. }
  104.  
  105. void Write(int x)
  106. {
  107. Pushdown(x);
  108. if (Son[x][]) Write(Son[x][]);
  109. if (x>= && x<=n+) printf("%d ",Key[x]);
  110. if (Son[x][]) Write(Son[x][]);
  111. }
  112.  
  113. int main()
  114. {
  115. scanf("%d%d",&n,&m);
  116. for (int i=;i<=n+;++i)
  117. a[i]=i-;
  118. Build(,n+,);Root=(n+)/;
  119. for (int i=;i<=m;++i)
  120. {
  121. scanf("%d%d",&l,&r);
  122. if (l>=r) continue;
  123. Rever(l,r);
  124. }
  125. Write(Root);
  126. }

3223. 文艺平衡树【平衡树-splay】的更多相关文章

  1. fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)

    题面: [模板]文艺平衡树(Splay) 题解:无 代码: #include<cstdio> #include<cstring> #include<iostream> ...

  2. P3391 【模板】文艺平衡树(Splay)新板子

    P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转 ...

  3. 洛谷——P3369 【模板】普通平衡树(splay)(基础splay,维护一些神奇的东东)

    P3369 [模板]普通平衡树 平衡树大法好,蒟蒻(博主)最近正在收集高级数据结构的碎片,企图合成数据结构的元素之力来使自己的RP++... 您需要写一种数据结构(可参考题目标题),来维护一些数,其中 ...

  4. bzoj 3223 文艺平衡树 - Splay

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

  5. 【BZOJ】3223: Tyvj 1729 文艺平衡树(splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3223 默默的.. #include <cstdio> #include <cstr ...

  6. bzoj 3223 文艺平衡树 splay 区间翻转

    Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 17715  Solved: 7769[Submit][Status][ ...

  7. BZOJ 3223 Tyvj 1729 文艺平衡树(Splay)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3223 [题目大意] 给出一数列,问m次区间翻转后的结果. [题解] Splay 区间翻 ...

  8. bzoj 3223 文艺平衡树 Splay 打标志

    是NOI2003Editor的一个子任务 #include <cstdio> #include <vector> #define maxn 100010 using names ...

  9. 【模板】文艺平衡树(Splay) 区间翻转 BZOJ 3223

    您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 N,M<= ...

随机推荐

  1. [日常] Go语言圣经前言

    https://books.studygolang.com/gopl-zh/ go语言圣经 1.Go语言有时候被描述为“C类似语言”,或者是“21世纪的C语言”. 2.Go语言中和并发编程相关的特性是 ...

  2. Linux下socket通信和多线程

    服务端socket流程:socket() –> bind() –> listen() –> accept() –> 读取.发送信息(recv,send等) 客户端socket流 ...

  3. 【学习笔记】--- 老男孩学Python,day18 面向对象------ 属性,类方法,静态方法

    属性 属性: 将方法伪装成一个属性,代码上没有什么提升,只是更合理. 应用场景: 类中 要用名词时候可以用@property  比如,求面积,周长,平方,体脂 等运算时候 例如:   bmi是名词,最 ...

  4. LINQ语法类似于SQL的语法

    LINQ语法类似于SQL的语法如下, Models.BookStoreEntities 是从添加新建项中的数据--->ADO.NET实体数据模型--->从数据库生成--->使用5.0 ...

  5. html-使用表单标签实现注册页面

    案例说明: - 使用表格实现页面效果 - 超链接不想要有效果,使用href="#" - 如果表格里面的单元格没有内容,使用空格作为占位符   - 使用图片标签提交表单 <in ...

  6. react组件直接在document上添加事件

    demo:比如组件里有个div写的框框,点击document body的背景色变红,点击div写的框框没效果 componentDidMount(){ document.onclick = this. ...

  7. 网络I/O模型--01阻塞模式(普通)

    很长一段时间内,大多数网络通信方式都是阻塞模式,即: · 客户端 向服务器端发出请求后,客户端会一直处于等待状态(不会再做其他事情),直到服务器端返回结果或者网络出现问题 . · 服务器端同样如此,当 ...

  8. Vue 框架-10-搭建脚手架 CLI

    Vue 框架-10-搭建脚手架 CLI + 批处理快捷启动 脚手架是通过 webpack 搭建的开发环境 使用 ES6 语法 打包和压缩 JS 为一个文件 项目文件在环境中,而不是浏览器 实现页面自动 ...

  9. 【个人经历】记自己的第一次GitHub开源代码共享经历

    题记: 自己做程序员快三年有余了,感觉自己和刚入职相比确实有了不少进步,当然三年要是不进步那不就傻了吗,有时候我也在想,我在这三年里留下了什么,当然也不是说有多么高尚的想法,就是以后对别人介绍自己的时 ...

  10. Oracle获取session的trace

    1. 使用参数SQL_TRACE 下面是官网对此参数的说明 SQL_TRACE Property Description Parameter type Boolean Default value fa ...