平衡树·Treap

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似。

小Hi:你说的是哪两个啊?

小Ho:就是二叉排序树和堆啊,你看这两种数据结构都是构造了一个二叉树,一个节点有一个父亲和两个儿子。 如果用1..n的数组来存储的话,对于二叉树上的一个编号为k的节点,其父亲节点刚好是k/2。并且它的两个儿子节点分别为k*2和k*2+1,计算起来非常方便呢。

小Hi:没错,但是小Hi你知道有一种办法可以把堆和二叉搜索树合并起来,成为一个新的数据结构么?

小Ho:这我倒没想过。不过二叉搜索树满足左子树<根节点<右子树,而堆是满足根节点小于等于(或大于等于)左右儿子。这两种性质是冲突的啊?

小Hi:恩,你说的没错,这两种性质的确是冲突的。

小Ho:那你说的合并是怎么做到的?

小Hi:当然有办法了,其实它是这样的....

提示:Tree+Heap?

输入

第1行:1个正整数n,表示操作数量,10≤n≤100,000

第2..n+1行:每行1个字母c和1个整数k:

若c为'I',表示插入一个数字k到树中,-1,000,000,000≤k≤1,000,000,000

若c为'Q',表示询问树中不超过k的最大数字

输出

若干行:每行1个整数,表示针对询问的回答,保证一定有合法的解

样例输入
  1. 5
  2. I 3
  3. I 2
  4. Q 3
  5. I 5
  6. Q 4
样例输出
  1. 3
  2. 3
 

下午看DXL的资料看到绝望,差点吐了,是真的恶心反胃的那种,也有可能是这几天熬夜的后果。

然后不得不暂时放弃,转向其它姿势点。然后就开始挑战平衡树,如果一拖再拖,也不知道扫时候才有着落。

毕竟,你看看,是不是还有很多树不会的呢,ORZ,orz

由于鄙人不习惯写指针,所以还是保留了一贯是数组写法。

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<cstdio>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N=;
  7. struct in
  8. {
  9. int l,r,v,rnd;//v 权值 rnd 堆的优先级
  10. } tree[N];
  11. int ans,cnt,root;
  12. void lturn(int &pos)
  13. {
  14. int tmp=tree[pos].r;
  15. tree[pos].r=tree[tmp].l;
  16. tree[tmp].l=pos;
  17. pos=tmp;
  18. }
  19. void rturn(int &pos)
  20. {
  21. int tmp=tree[pos].l;
  22. tree[pos].l=tree[tmp].r;
  23. tree[tmp].r=pos;
  24. pos=tmp;
  25. }
  26. void insert(int &pos,int x)
  27. {
  28. if(!pos){
  29. pos=++cnt;
  30. tree[cnt].v=x;
  31. tree[cnt].rnd=rand();
  32. return ;
  33. }
  34. if(tree[pos].v==x) return ;//此题无需重复操作
  35. else if(tree[pos].v>x){
  36. insert(tree[pos].l,x);
  37. if(tree[tree[pos].l].rnd>tree[pos].rnd)
  38. rturn(pos);
  39. }
  40. else {
  41. insert(tree[pos].r,x);
  42. if(tree[tree[pos].r].rnd>tree[pos].rnd)
  43. lturn(pos);
  44. }
  45. }
  46. void query(int u,int x){
  47. if(u==) return ;
  48. if(tree[u].v<=x){
  49. ans=u;
  50. query(tree[u].r,x);
  51. }
  52. else query(tree[u].l,x);
  53. }
  54. int main()
  55. {
  56. int i,x,n,k;
  57. char c[];
  58. scanf("%d",&n);
  59. while(n--){
  60. scanf("%s%d",&c,&x);
  61. if(c[]=='I'){
  62. insert(root,x);
  63. }
  64. else {
  65. query(root,x);
  66. printf("%d\n",tree[ans].v);
  67. }
  68. }
  69. return ;
  70. }

以及STL版本:

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstdlib>
  5. #include<set>
  6. using namespace std;
  7. int main()
  8. {
  9. int n,x,ans;
  10. set<int> s;
  11. char c[];
  12. scanf("%d",&n);
  13. while (n--){
  14. scanf("%s%d",&c,&x);
  15. if (c[]=='I')
  16. s.insert(x);
  17. else{
  18. set<int>::iterator it = s.upper_bound(x);
  19. it--;
  20. printf("%d\n",*it);
  21. }
  22. }
  23. return ;
  24. }

HihoCoder1325 : 平衡树·Treap(附STL版本)的更多相关文章

  1. HihoCoder1329 平衡树·Splay(附STL版)

    输入 第1行:1个正整数n,表示操作数量,100≤n≤200,000 第2..n+1行:可能包含下面3种规则: 1个字母'I',紧接着1个数字k,表示插入一个数字k到树中,1≤k≤1,000,000, ...

  2. hiho #1325 : 平衡树·Treap

    #1325 : 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? ...

  3. hiho一下103周 平衡树·Treap

    平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二 ...

  4. 算法模板——平衡树Treap 2

    实现功能:同平衡树Treap 1(BZOJ3224 / tyvj1728) 这次的模板有了不少的改进,显然更加美观了,几乎每个部分都有了不少简化,尤其是删除部分,这个参照了hzwer神犇的写法,在此鸣 ...

  5. 【山东省选2008】郁闷的小J 平衡树Treap

    小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的.具体说来,书架由N ...

  6. Hihocoder 1325 平衡树·Treap(平衡树,Treap)

    Hihocoder 1325 平衡树·Treap(平衡树,Treap) Description 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二叉 ...

  7. HihoCoder 1325 平衡树·Treap

    HihoCoder 1325 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说 ...

  8. 普通平衡树Treap(含旋转)学习笔记

    浅谈普通平衡树Treap 平衡树,Treap=Tree+heap这是一个很形象的东西 我们要维护一棵树,它满足堆的性质和二叉查找树的性质(BST),这样的二叉树我们叫做平衡树 并且平衡树它的结构是接近 ...

  9. luoguP3369[模板]普通平衡树(Treap/SBT) 题解

    链接一下题目:luoguP3369[模板]普通平衡树(Treap/SBT) 平衡树解析 #include<iostream> #include<cstdlib> #includ ...

随机推荐

  1. Atom常用快捷键及设置

    常用快捷键: cmd-z 修改历史中后退 cmd-y 修改历史中前进 ctl-shift-c 复制该聚焦文件的路径 cmd-/ 注释 shift-cmd-d 复制整行并粘贴到下一行 ctl-shift ...

  2. Linux系统服务管理 服务管理

    Linux独立服务管理 启动服务 systemctl start 服务名称.service 设置开机自启动 systemctl enable 服务名称.service 停止开机自启动 systemct ...

  3. HashMap的简单源码分析(看了大佬的源码,基于1.7) put方法

    参考博客: https://blog.csdn.net/eson_15/article/details/51158865 hashMap中的几个关键属性 //默认初始容量是16,必须是2的幂 stat ...

  4. git常用命令【转】

    先上一个git常用命令图片 Git配置 1 2 3 4 5 6 7 8 9 git config --global user.name "robbin"   git config ...

  5. 基于jQuery和Bootstrap的手风琴垂直菜单

    在线演示 本地下载

  6. 二叉树、平衡二叉树、B-Tree与B+Tree

    本文总结自:https://blog.csdn.net/chuixue24/article/details/80027689 二叉树(B树,binary tree) 左子树的键值 < 根的键值 ...

  7. Java基础之冒泡排序

    冒泡排序 基本介绍 冒泡排序是比较相邻的两个元素,通过不停的比较,较大的数往下沉,较小的往上冒,这也是冒泡排序名字的来源 第一趟从数组下标为0的数字开始,arr[0]大于arr[1]就交换他们的位置, ...

  8. CentOS限制SSH登录地址

    编辑hosts.allow文件,将允许连接的地址写进去 [root@Elements ~]# vim /etc/hosts.allow sshd:10.10.10.1:allow sshd:172.1 ...

  9. Gradle 引入本地定制 jar 包,而不使用坐标下载 jar 包的方法

    第 1 步:创建文件夹,拷贝 jar 包 在自己的 Gradle 项目里建立一个名为 “libs” (这个名字可以自己定义,不一定非要叫这个名字)的文件夹,把自己本地的 jar 包拷贝到这个文件夹中. ...

  10. 拖拽窗口的实现-JQuery实现;

    主要是距离的掌握 如图,原始位置和当前位置. 对于当前位置:想要求得left值b',需要b'=a'-c; 其中,a’= ev.pageX;就是指针当前距离文档左边的距离: 同时,可以发现c在拖拽过程中 ...