题解:

每次reverse(l,r)

把l-1转到根,r+1变成他的右儿子,给r+1的左儿子打个标记就是一次反转操作了

每次find和dfs输出的时候下放标记,把左儿子和右儿子换一下

记得建树的时候建0到n+1

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #define N 100010
  5. #define which(x) (ls[fa[(x)]]==(x))
  6. using namespace std;
  7. int sz[N],ls[N],rs[N],fa[N],n,m,root,flag[N],id[N],idx;
  8. void upt(int x) {sz[x]=+sz[ls[x]]+sz[rs[x]];}
  9. int read()
  10. {
  11. int ret=,neg=;
  12. char j=getchar();
  13. for (;j>'' || j<'';j=getchar())
  14. if (j=='-') neg=-;
  15. for (;j>='' && j<='';j=getchar())
  16. ret=ret*+j-'';
  17. return ret*neg;
  18. }
  19. void write(int x)
  20. {
  21. if (x<) x=-x;
  22. if (x>=) write(x/);
  23. putchar(x%+'');
  24. }
  25. void swap_son(int u)
  26. {
  27. if (!u) return;
  28. flag[u]^=;
  29. swap(ls[u],rs[u]);
  30. upt(u);
  31. }
  32. void pushdown(int u)
  33. {
  34. if (!flag[u]) return ;
  35. swap_son(ls[u]),swap_son(rs[u]);
  36. flag[u]=;
  37. }
  38. int Build(int l, int r)
  39. {
  40. int mid=l+r>>,u=++idx;
  41. id[u]=mid;
  42. if(mid>l) ls[u]=Build(l,mid-),fa[ls[u]]=u;
  43. if(mid<r) rs[u]=Build(mid+,r),fa[rs[u]]=u;
  44. upt(u);
  45. return u;
  46. }
  47. void Rotate(int u)
  48. {
  49. int v=fa[u],w=fa[v],b=which(u)?rs[u]:ls[u];
  50. if(w) which(v)?ls[w]=u:rs[w]=u;
  51. which(u)?(ls[v]=b,rs[u]=v):(rs[v]=b,ls[u]=v);
  52. fa[u]=w,fa[v]=u;
  53. if(b) fa[b]=v;
  54. upt(v),upt(u);
  55. }
  56. void Splay(int u, int tar)
  57. {
  58. while(fa[u] != tar)
  59. {
  60. if(fa[fa[u]] != tar)
  61. {
  62. if(which(u) == which(fa[u])) Rotate(fa[u]);
  63. else Rotate(u);
  64. }
  65. Rotate(u);
  66. }
  67. if(!tar) root = u;
  68. }
  69. int find(int k)
  70. {
  71. int u=root;
  72. pushdown(u);
  73. while (sz[ls[u]]+!=k && u)
  74. {
  75. if (sz[ls[u]]>=k) u=ls[u];
  76. else k-=sz[ls[u]]+,u=rs[u];
  77. pushdown(u);
  78. }
  79. return u;
  80. }
  81. void rev(int l,int r)
  82. {
  83. int u=find(l-),v=find(r+);
  84. Splay(u,);
  85. Splay(v,u);
  86. swap_son(ls[rs[root]]);
  87. }
  88. void dfs(int u)
  89. {
  90. pushdown(u);
  91. if (ls[u]) dfs(ls[u]);
  92. if (id[u]> && id[u]<n+) write(id[u]-),putchar(' ');
  93. if (rs[u]) dfs(rs[u]);
  94. }
  95. int main()
  96. {
  97. scanf("%d%d",&n,&m);
  98. root=Build(,n+);
  99. for (int i=,l,r;i<=m;i++)
  100. l=read(),r=read(),rev(l+,r+);
  101. dfs(root);
  102. return ;
  103. }

BZOJ 3223 Tyvj 1729 文艺平衡树 | Splay 维护序列关系的更多相关文章

  1. BZOJ 3223: Tyvj 1729 文艺平衡树(splay)

    速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...

  2. bzoj 3223: Tyvj 1729 文艺平衡树 (splay)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3223 题面: 3223: Tyvj 1729 文艺平衡树 Time Limit: 10 S ...

  3. BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题

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

  4. bzoj 3223/tyvj 1729 文艺平衡树 splay tree

    原题链接:http://www.tyvj.cn/p/1729 这道题以前用c语言写的splay tree水过了.. 现在接触了c++重写一遍... 只涉及区间翻转,由于没有删除操作故不带垃圾回收,具体 ...

  5. BZOJ - 3223 Tyvj 1729 文艺平衡树 (splay/无旋treap)

    题目链接 splay: #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f ...

  6. BZOJ 3223: Tyvj 1729 文艺平衡树

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

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

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

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

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

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

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

随机推荐

  1. discuz 被入侵后,最可能被修改的文件

    最近发现站点被黑了,现在还不知道是由系统漏洞导致的系统账户被攻陷,还是程序漏洞,文件被篡改.有一些敏感关键词(例如:赌博,电子路单)被恶意指向,点击搜索结果自动跳转到其他站点,而且是大量的,通过搜索“ ...

  2. 【学时总结】◆学时·V◆ 逆元法

    ◆学时·V◆ 逆元法 □算法概述□ 逆元运算是模运算中的一个技巧,一般用于解决模运算的除法问题.模运算对于加.减.乘是有封闭性的,即 (a±b)%m=a%m±b%m,以及 (a×b)%m=a%m×b% ...

  3. java高并发之CountDownLatch,CyclicBarrier和join

    晚上打车回家,在车上看到一篇文章<22岁大学生获谷歌天价Offer,年薪千万!>,讲的是印度一个22岁大学生多次参加ACM大赛,开源多个项目,以非常牛逼的履历通过了谷歌的AI测试,斩获谷歌 ...

  4. php 删除指定扩展名文件

    <?php /** *@param $path文件夹绝对路径 $file_type待删除文件的后缀名 *return void */ function clearn_file($path, $f ...

  5. 从0开始学习 Git

    1. 什么是Git? Git 是 Linux 发明者 Linus 开发的一款新时代的版本控制系统,那什么是版本控制系统呢?怎么理解?网上一大堆详细的介绍,但是大多枯燥乏味,对于新手也很难理解,这里我只 ...

  6. Ubuntu16.04下配置ssh免密登录

    Ubuntu16.04下配置ssh免密登录 环境准备:新建两台虚拟机,而且两台虚拟机上都装有Ubuntu16.04的系统,使两台虚拟机之间保持互通状态.分别为两台虚拟机命名为A,B.假设我们要使A虚拟 ...

  7. Linux基本的指令操作

    绝对路径: 路径的写法,由根目录/写起,例如:/usr/share/doc这个目录. 相对路径: 路径的写法,不由/写起,例如由/usr/share/doc要到/usr/share/man底下时,可以 ...

  8. python爬虫:利用BeautifulSoup爬取链家深圳二手房首页的详细信息

    1.问题描述: 爬取链家深圳二手房的详细信息,并将爬取的数据存储到Excel表 2.思路分析: 发送请求--获取数据--解析数据--存储数据 1.目标网址:https://sz.lianjia.com ...

  9. Android Studio的Log日志调试

    本人菜鸟一枚,极大发挥了搜索的功能.现记录一番,以备后患. 用断点真的很烦,因为之前写linux的时候,就是用最蠢但是也是挺有帮助的printf()来进行调试. 其实用Log输出日志的原理也是差不多的 ...

  10. 内置函数--sorted,filter,map

    sorted() 排序函数. 语法: sorted(Iterable, key=None, reverse=False) Iterable: 可迭代对象;  key: 排序规则(排序函数); reve ...