Tyvj 1728 普通平衡树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 17715  Solved: 7769
[Submit][Status][Discuss]

Description

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)

Input

第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6)

Output

对于操作3,4,5,6每行输出一个数,表示对应答案

Sample Input

10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598

Sample Output

106465
84185
492737

HINT

1.n的数据范围:n<=100000
2.每个数的数据范围:[-2e9,2e9]

Source

 
题解:
  区间翻转就没了。
  1. #include<cstring>
  2. #include<cmath>
  3. #include<algorithm>
  4. #include<iostream>
  5. #include<cstdio>
  6.  
  7. #define inf 1000000007
  8. #define N 100007
  9. #define ls c[p][0]
  10. #define rs c[p][1]
  11. using namespace std;
  12. inline int read()
  13. {
  14. int x=,f=;char ch=getchar();
  15. while(ch>''||ch<''){if (ch=='-') f=-;ch=getchar();}
  16. while(ch<=''&&ch>=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
  17. return x*f;
  18. }
  19.  
  20. int n,m,rt;
  21. int fa[N],val[N],rev[N],mx[N],sz[N],flag[N],c[N][];
  22.  
  23. inline void update(int p)
  24. {
  25. sz[p]=sz[ls]+sz[rs]+;
  26. }
  27. inline void pushdown(int p)
  28. {
  29. if (rev[p])
  30. {
  31. rev[p]^=;
  32. rev[ls]^=,rev[rs]^=;
  33. swap(c[p][],c[p][]);
  34. }
  35. }
  36. void rotate(int x,int &k)
  37. {
  38. int y=fa[x],z=fa[y],l,r;
  39. if (c[y][]==x) l=;else l=;r=l^;
  40. if (y==k) k=x;//交换后x就等于y
  41. else if (c[z][]==y) c[z][]=x;
  42. else c[z][]=x;
  43. fa[x]=z,fa[y]=x,fa[c[x][r]]=y;
  44. c[y][l]=c[x][r],c[x][r]=y;
  45. update(y),update(x);
  46. }
  47. void splay(int x,int &k)
  48. {
  49. while(x!=k)
  50. {
  51. int y=fa[x],z=fa[y];
  52. if (y!=k)
  53. {
  54. if (c[y][]==x^c[z][]==y) rotate(x,k);
  55. else rotate(y,k);
  56. }
  57. rotate(x,k);
  58. }
  59. }
  60. int find(int p,int num)
  61. {
  62. pushdown(p);
  63. if (sz[ls]>=num) return find(ls,num);
  64. else if (sz[ls]+==num) return p;
  65. else return find(rs,num-sz[ls]-);
  66. }
  67. void spin(int l,int r)
  68. {
  69. int x=find(rt,l),y=find(rt,r+);
  70. splay(x,rt),splay(y,c[x][]);
  71. int now=c[c[x][]][];
  72. rev[now]^=;
  73. }
  74. void build(int l,int r,int p)
  75. {
  76. if (l>r) return;
  77. if (l==r)
  78. {
  79. fa[l]=p,sz[l]=,val[l]=l;
  80. if (l<p) c[p][]=l;
  81. else c[p][]=l;
  82. return;
  83. }
  84. int mid=(l+r)>>;
  85. build(l,mid-,mid),build(mid+,r,mid);
  86. fa[mid]=p,val[mid]=mid;
  87. if (mid<p) c[p][]=mid;
  88. else c[p][]=mid;
  89. update(mid);
  90. }
  91. int main()
  92. {
  93. n=read(),m=read();
  94. build(,n+,),rt=(n+)>>;
  95. while(m--)
  96. {
  97. int x=read(),y=read();
  98. spin(x,y);
  99. }
  100. for (int i=;i<=n;i++)
  101. {
  102. int x=find(rt,i+);
  103. if (i==) cout<<val[x]-;
  104. else cout<<" "<<val[x]-;
  105. }
  106. }

bzoj 3223 文艺平衡树 splay 区间翻转的更多相关文章

  1. bzoj 3223 文艺平衡树 - Splay

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

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

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

  3. [题解]bzoj 3223 文艺平衡树

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

  4. BZOJ 3223 文艺平衡树

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

  5. bzoj 1251序列终结者 splay 区间翻转,最值,区间更新

    序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 4594  Solved: 1939[Submit][Status][Discuss] De ...

  6. BZOJ 3223 文艺平衡树 [codevs3303翻转区间]

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=3223 通道2:http://codevs.cn/problem/3303/ 题目分析: 我 ...

  7. 文艺平衡树(区间翻转)(Splay模板)

    这篇blog写的吼啊 #include<cstdio> #include<iostream> #include<cstring> using namespace s ...

  8. 洛谷 3391 【模板】文艺平衡树 Treap区间翻转

    [题解] 用Treap维护这个序列. 加入的时候直接插入到末尾,这样Treap就变成一棵以插入时间先后为排序关键字的二叉搜索树. 对于翻转操作,我们分裂出需要翻转的区间,给这个区间的root打一个翻转 ...

  9. [bzoj3223]文艺平衡树(splay区间反转模板)

    解题关键:splay模板题. #include<cstdio> #include<cstring> #include<algorithm> #include< ...

随机推荐

  1. Git-远程操作

    远程分支:远程跟踪分支remote branch是对远程分支状态的引用,是不能移动的,它会根据远程分支变化以及网络通信自动移动.Git服务器包含了远程分支master,在My Computer中的re ...

  2. SQL数据库学习,常用语句查询大全

    数据库学习 sql server数据库基本概念 使用文件保存数据存在几个缺点: 1.文件的安全性问题: 2.文件不利于查询和对数据的管理: 3.文件不利于存放海量数据 4.文件在程序中控制不方便. 数 ...

  3. Android Studio V4 V7 包冲突的问题

    最近被包冲突的问题搞奔溃了,特别是V4,V7 V4和V7包冲突的解决方式就是!版本要一致!! 比如我的一个项目中应用本来是这样引用包的 compile 'com.android.support:sup ...

  4. HDU 5416 CRB and Tree (技巧)

    题意:给一棵n个节点的树(无向边),有q个询问,每个询问有一个值s,问有多少点对(u,v)的xor和为s? 注意:(u,v)和(v,u)只算一次.而且u=v也是合法的. 思路:任意点对之间的路径肯定经 ...

  5. MFC技术积累——基于MFC对话框类的那些事儿2

    3. 绘图 3.1 对话框资源编辑 首先通过添加控件的方式来创建一个简单的绘图对话框如图所示,创建步骤为: 第一.在VC++6.0软件环境的灰色空白区域右击,选中Controls,然后会弹出一个控件对 ...

  6. saltstack 源码安装

    面向对象编程(oop) 面向对象: 面向对象三大特性: 封装 继承 多肽封装: 封装就是将具体的客观事物封装成抽象的类.并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可行的进行信息隐藏继承 ...

  7. index 定义 v-for 未使用变量 实际是没有 :key="index"

    需要有 :key="index" <Checkbox :label="item.key" :key="index" v-for=&qu ...

  8. 部署 k8s Cluster(下)【转】

    上节我们通过 kubeadm 在 k8s-master 上部署了 Kubernetes,本节安装 Pod 网络并添加 k8s-node1 和 k8s-node2,完成集群部署. 安装 Pod 网络 要 ...

  9. 0xc000007b——应用程序无法正常启动

    0xc000007b——应用程序无法正常启动 原因:缺少exe程序启动所需要的DLL.

  10. python-opencv 分离图片(视频)中的某一颜色物体

    看代码: import cv2 as cv import numpy as np def separate_color(frame): cv.imshow("原图", frame) ...