普通van Emde Boas树

Time Limit: 9 Sec  Memory Limit: 128 MB
Submit: 1969  Solved: 639
[Submit][Status][Discuss]

Description

设计数据结构支持:
1 x  若x不存在,插入x
2 x  若x存在,删除x
3    输出当前最小值,若不存在输出-1
4    输出当前最大值,若不存在输出-1
5 x  输出x的前驱,若不存在输出-1
6 x  输出x的后继,若不存在输出-1
7 x  若x存在,输出1,否则输出-1

Input

第一行给出n,m 表示出现数的范围和操作个数
接下来m行给出操作
n<=10^6,m<=2*10^6,0<=x<n

Output

Sample Input

10 11
1 1
1 2
1 3
7 1
7 4
2 1
3
2 3
4
5 3
6 2

Sample Output

1
-1
2
2
2
-1

HINT

Source

题解:

  很多数据结构都可以解决。

  权值线段树就可以。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6.  
  7. #define N 3000007
  8.  
  9. using namespace std;
  10. inline int read()
  11. {
  12. int x=,f=;char ch=getchar();
  13. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  14. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  15. return x*f;
  16. }
  17.  
  18. int n,m;
  19. struct seg
  20. {
  21. int l,r,v;
  22. }t[N];
  23.  
  24. void build(int k,int l,int r)
  25. {
  26. t[k].l=l;t[k].r=r;
  27. if(l==r)return;
  28. int mid=(l+r)>>;
  29. build(k<<,l,mid);
  30. build(k<<|,mid+,r);
  31. }
  32. int mn(int k)
  33. {
  34. if(!t[k].v)return -;
  35. int l=t[k].l,r=t[k].r;
  36. if(l==r)return l;
  37. if(t[k<<].v)return mn(k<<);
  38. else return mn(k<<|);
  39. }
  40. int mx(int k)
  41. {
  42. if(!t[k].v)return -;
  43. int l=t[k].l,r=t[k].r;
  44. if(l==r)return l;
  45. if(t[k<<|].v)return mx(k<<|);
  46. else return mx(k<<);
  47. }
  48. void insert(int k,int val)
  49. {
  50. int l=t[k].l,r=t[k].r;
  51. if(l==r){t[k].v=;return;}
  52. int mid=(l+r)>>;
  53. if(val<=mid)insert(k<<,val);
  54. else insert(k<<|,val);
  55. t[k].v=t[k<<].v+t[k<<|].v;
  56. }
  57. int find(int k,int val)
  58. {
  59. int l=t[k].l,r=t[k].r;
  60. if(l==r)
  61. {
  62. if(t[k].v)return ;
  63. return -;
  64. }
  65. int mid=(l+r)>>;
  66. if(val<=mid)return find(k<<,val);
  67. else return find(k<<|,val);
  68. }
  69. void del(int k,int val)
  70. {
  71. int l=t[k].l,r=t[k].r;
  72. if(l==r){t[k].v=;return;}
  73. int mid=(l+r)>>;
  74. if(val<=mid)del(k<<,val);
  75. else del(k<<|,val);
  76. t[k].v=t[k<<].v+t[k<<|].v;
  77. }
  78. int findpr(int k,int val)
  79. {
  80. if(val<)return -;
  81. if(!t[k].v)return -;
  82. int l=t[k].l,r=t[k].r;
  83. if(l==r)return l;
  84. int mid=(l+r)>>;
  85. if(val<=mid)return findpr(k<<,val);
  86. else
  87. {
  88. int t=findpr(k<<|,val);
  89. if(t==-)return mx(k<<);
  90. else return t;
  91. }
  92. }
  93. int findsu(int k,int val)
  94. {
  95. if(!t[k].v)return -;
  96. int l=t[k].l,r=t[k].r;
  97. if(l==r)return l;
  98. int mid=(l+r)>>;
  99. if(val>mid)return findsu(k<<|,val);
  100. else
  101. {
  102. int t=findsu(k<<,val);
  103. if(t==-)return mn(k<<|);
  104. else return t;
  105. }
  106. }
  107. int main()
  108. {
  109. n=read(),m=read();
  110. build(,,n);
  111. int opt,x;
  112. for(int i=;i<=m;i++)
  113. {
  114. opt=read();
  115. switch(opt)
  116. {
  117. case :x=read();if(find(,x)==-)insert(,x);break;
  118. case :x=read();if(find(,x)==)del(,x);break;
  119. case :printf("%d\n",mn());break;
  120. case :printf("%d\n",mx());break;
  121. case :x=read();printf("%d\n",findpr(,x-));break;
  122. case :x=read();printf("%d\n",findsu(,x+));break;
  123. case :x=read();printf("%d\n",find(,x));break;
  124. }
  125. }
  126. }

【bzoj3685】普通van Emde Boas树 线段树的更多相关文章

  1. bzoj3685普通van Emde Boas树 线段树

    3685: 普通van Emde Boas树 Time Limit: 9 Sec  Memory Limit: 128 MBSubmit: 1932  Solved: 626[Submit][Stat ...

  2. 【权值分块】bzoj3685 普通van Emde Boas树

    权值分块,虽然渐进复杂度不忍直视,但其极小的常数使得实际运行起来比平衡树快,大多数情况和递归版权值线段树差不多,有时甚至更快.但是被zkw线段树完虐. #include<cstdio> # ...

  3. BZOJ3685: 普通van Emde Boas树

    显然这题的所有操作都可以用set,但是直接用set肯定要T,考虑到读入量较大,使用fread读入优化,就可以卡过去了. #include<bits/stdc++.h> using name ...

  4. BZOJ 3685: 普通van Emde Boas树( 线段树 )

    建颗权值线段树就行了...连离散化都不用... 没加读入优化就TLE, 加了就A掉了...而且还快了接近1/4.... ---------------------------------------- ...

  5. BZOJ_3685_普通van Emde Boas树_权值线段树

    BZOJ_3685_普通van Emde Boas树_权值线段树 Description 设计数据结构支持: 1 x  若x不存在,插入x 2 x  若x存在,删除x 3    输出当前最小值,若不存 ...

  6. bzoj 3685: 普通van Emde Boas树

    3685: 普通van Emde Boas树 Description 设计数据结构支持:1 x  若x不存在,插入x2 x  若x存在,删除x3    输出当前最小值,若不存在输出-14    输出当 ...

  7. 浅谈 van Emde Boas 树——从 u 到 log log u 的蜕变

    本文参考算法导论完成. 模板题在此 QwQ 优化的过程比较长,还请读者耐心阅读,认真理解. 最初的想法 我会暴力! 用一个 \(size\) 数组维护每个元素出现的次数. 不细讲,时间复杂度 \(O( ...

  8. 算法导论笔记——第二十章 van Emde Boas树

    当关键字是有界范围内的整数时,能够规避Ω(lglgn)下界的限制,那么在类似的场景下,我们应弄清楚o(lgn)时间内是否可以完成优先队列的每个操作.在本章中,我们将看到:van Emde Boas树支 ...

  9. Van Emde Boas Tree

    van Emde Boas trees 支持所有优先级优先级队列的操作,并且巧妙的是它对于SEARCH, INSERT,DELETE,MINIMUM,MAXMUN,SUCCESSOR,和PREDECE ...

随机推荐

  1. asp.net 中 UpdataPanel 的使用注意点

    1. 在UpdataPanel 前必须加上asp:ScriptManager的控件,保证页面能够正常显示

  2. HTML5/CSS3 第三章页面布局

    页面布局 1 页面组成 2 布局相关的标签 <div></div> 定义文档中的分区或节 <span></span> 这是一个行内元素,没有任何意义 & ...

  3. 【CSS】简略说明css的权重之分

    /*权重 :id > class > 标签 (小环境) 权重:内联 > 内部 > 外部 (大环境) 小环境处于内部环境中 */ <style> #p1{ /* id ...

  4. 用iTerm快速链接远程服务器

    通常情况下,iTerm2访问远程Linux使用ssh ssh <用户名>@<ip> 然后输入访问的密码即可.当然还有的时候需要指定访问端口. ssh -p <端口号> ...

  5. 必须使用member initialization list来初始化的情况

    // member initialization #include <iostream> using namespace std; class Circle { double radius ...

  6. mysql-show processlist之writing to net

    mysql提示Writing to net解决 最近发现某一个数据库cpu占用比较过.超过200%了. 首先查看数据库慢日志,设定慢日志5秒,基本上没有产生日,没有超过5秒的语句. show proc ...

  7. Java 关键字volatile 与 synchronized 作用与区别

     1,volatile 它所修饰的变量不保留拷贝,直接访问主内存中的.    在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器).为了性能,一个线程会在自己 ...

  8. linux下编译openjdk8

    一.准备工作                                                           1.0 工作环境 Ubuntu 12.04,32位机 1.1.安装JD ...

  9. Java文件 ---流

    分类 根据数据走向,分为输入流.输出流 根据处理的数据类型,分为字节流.字符流 字节流 可以处理所有类型的数据,如MP3.图片.文字.视频等.在读取时,读到一个字节就返回一个字节. 在Java中对应的 ...

  10. Linux服务器管理员必备Linux命令TOP5

    Linux桌面环境的界面友好度.图形性能及附件工具已经大幅进化,然而Linux服务器却还没有能达到这一步. 作为系统管理员必须熟练掌握Linux命令.Linux命令的内容很多,其中的一些TOP命令对于 ...