普通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. js打印div指定区域内容

    <script> function myPrint(obj){ var newWindow=window.open("打印窗口","_blank") ...

  2. iOS 中push和pop到底系统做了些什么事

    iOS中的push和pop是一个很常用的视图切换方法,他们是成对出现的, 简而言之,push就是压栈,pop就是出栈! [self.navigationController pushViewContr ...

  3. MySQL DBA从小白到大神实战

    MySQL5.6 For CentOS 6.6 源码编译安装 o1.关闭防火墙o2.配置sysctl.confo3.检查操作系统上是否安装了MySQLo4.下载mysql源码包o5.添加用户和组o6. ...

  4. Java - 通过私有构造方法获取实例

  5. k8s的ingress资源简述

    ingress controller是独立与controller-manager的Ingress的主要作用是可以利用nginx,haproxy,envoy,traefik等负载均衡器来暴露集群内部服务 ...

  6. 【Python学习之八】ORM

    ORM 什么是ORM呢? ORM全称是:Object-Relational Mapping.即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表.这样,写代码更简单,不用直接 ...

  7. 异步解决方案----Promise与Await

    前言 异步编程模式在前端开发过程中,显得越来越重要.从最开始的XHR到封装后的Ajax都在试图解决异步编程过程中的问题.随着ES6新标准的到来,处理异步数据流又有了新的方案.我们都知道,在传统的aja ...

  8. windows环境下安装npm、cnpm、bower

    什么是npm.cnpm.bower? 简单地说,就是帮你下载好你需要的css或者js库,而且三者功能也都是一样的.那为什么要下载这3个不同的呢?据说npm容易被墙……而cnpm是淘宝的镜像,所以通常用 ...

  9. JZOJ 5459. 【NOIP2017提高A组冲刺11.7】密室

    5459. [NOIP2017提高A组冲刺11.7]密室 (File IO): input:room.in output:room.out Time Limits: 1000 ms  Memory L ...

  10. Python基础:条件与循环

    条件语句 除了 boolean 类型的数据,条件判断最好是显性的 if i != 0: ... 而不是只写出变量名: if i: ... For循环与While循环 通常来说,如果你只是遍历一个已知的 ...