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

常规做法是用线段树,但根据这题的特点,还有很多其它数据结构可以用。

将线段树和trie结合,可得每个结点有8个子结点的线段树,每个结点压位维护8个子树是否非空。

预处理每个状态最左/右非空子树位置。

插入或删除时自底向上修改。查询前驱后继时自底向上找到前驱或后继所在区间再向下找到其具体位置。

最后加读入/输出优化,比zkw线段树略快一点,内存也省了很多。

  1. #include<cstdio>
  2. inline int read(){
  3. char c=getchar();
  4. int x=;
  5. while(c>''||c<'')c=getchar();
  6. while(c>=''&&c<='')
  7. x=x*+c-'',c=getchar();
  8. return x;
  9. }
  10. char str[];
  11. inline void print(int x){
  12. if(!x){
  13. puts("");
  14. return;
  15. }
  16. if(x<)putchar('-'),x=-x;
  17. int p=;
  18. while(x)str[p++]=x%+'',x/=;
  19. while(p)putchar(str[--p]);
  20. putchar();
  21. }
  22. bool d[];
  23. unsigned char ds[][];
  24. int lp[],rp[];
  25. int ls[],rs[];
  26. inline void ins(int x){
  27. if(d[x])return;
  28. d[x]=;
  29. for(int i=;i<=;i++)ds[i][x>>i*]|=<<((x>>i*-)&);
  30. }
  31. inline void del(int x){
  32. if(d[x])d[x]=;
  33. else return;
  34. for(int i=;i<=;i++)if(ds[i][x>>i*]^=<<((x>>i*-)&))return;
  35. }
  36. inline int minv(){
  37. if(!ds[][])return -;
  38. register int p=lp[ds[][]];
  39. for(int i=;i;--i)p=(p<<)+lp[ds[i][p]];
  40. return p;
  41. }
  42. inline int maxv(){
  43. if(!ds[][])return -;
  44. register int p=rp[ds[][]];
  45. for(int i=;i;--i)p=(p<<)+rp[ds[i][p]];
  46. return p;
  47. }
  48. inline int prv(int p){
  49. if(!ds[][])return -;
  50. register int s=ds[][p>>]&ls[p&];
  51. if(s)return (p^(p&))|rp[s];
  52. for(int i=;i<=;i++){
  53. p>>=;
  54. s=ds[i][p>>]&ls[p&];
  55. if(s){
  56. p=(p^(p&))|rp[s];
  57. for(int j=i-;j;--j)p=(p<<)|rp[ds[j][p]];
  58. return p;
  59. }
  60. }
  61. return -;
  62. }
  63. inline int nxt(int p){
  64. if(!ds[][])return -;
  65. register int s=ds[][p>>]&rs[p&];
  66. if(s)return (p^(p&))|lp[s];
  67. for(int i=;i<=;i++){
  68. p>>=;
  69. s=ds[i][p>>]&rs[p&];
  70. if(s){
  71. p=(p^(p&))|lp[s];
  72. for(int j=i-;j;--j)p=(p<<)|lp[ds[j][p]];
  73. return p;
  74. }
  75. }
  76. return -;
  77. }
  78. int n,m,a,b;
  79. int main(){
  80. for(int i=;i<;i++){
  81. int j=;
  82. while(!(i&<<j))++j;
  83. lp[i]=j;
  84. j=;
  85. while(!(i&<<j))--j;
  86. rp[i]=j;
  87. }
  88. for(int i=;i<;i++)ls[i]=>>-i,rs[i]=&(<<i+);
  89. n=read();
  90. m=read();
  91. for(int i=;i<m;i++){
  92. a=read();
  93. if(a<){
  94. b=read();
  95. if(a==)ins(b);
  96. else if(a==)del(b);
  97. }else if(a>){
  98. b=read();
  99. if(a==)print(prv(b));
  100. else if(a==)print(nxt(b));
  101. else if(a==)puts(d[b]&&ds[][b>>]&<<(b&)?"":"-1");
  102. }else if(a==)print(minv());
  103. else if(a==)print(maxv());
  104.  
  105. }
  106. return ;
  107. }

bzoj3685 普通veb树的更多相关文章

  1. bzoj 3685: 普通van Emde Boas树

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

  2. PLAN OF HEOI(unfinished)

    Au:整体二分/计算几何/多项式/fwtAg:可持久化重量平衡树/线段树分治/线段树合并/最短路树/最短路DAGCu:三分Up:博弈论/置换群/杜教筛/矩阵树定理/BSGS/动态树分治/网络流(线性规 ...

  3. bzoj题目分类

    转载于http://blog.csdn.net/creationaugust/article/details/513876231000:A+B 1001:平面图最小割,转对偶图最短路 1002:矩阵树 ...

  4. Largest Submatrix 3 CodeForces - 407D (dp,好题)

    大意: 给定矩阵, 求选出一个最大矩形, 满足矩形内每个元素互不相同. 考虑枚举上下左三个边界, 求出最大右边界的位置. 注意到固定上边界, 下边界递推时, 每个左边界对应最大右边界是单调不增的. 所 ...

  5. 【BZOJ3685】【zkw权值线段树】普通van Emde Boas树

    原题传送门 因为马上要开始搞树套树了,所以学了一波权值线段树...毕竟是会点zkw线段树的,所以zkw线段树大法好! 解题思路: 介绍一下权值线段树吧,其实感觉就是线段树的本义,就是你用线段树维护了数 ...

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

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

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

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

  8. 【bzoj3685】普通van Emde Boas树 权值zkw线段树

    原文地址:http://www.cnblogs.com/GXZlegend/p/6809743.html 题目描述 设计数据结构支持:1 x  若x不存在,插入x2 x  若x存在,删除x3    输 ...

  9. 【bzoj3685】普通van Emde Boas树 线段树

    普通van Emde Boas树 Time Limit: 9 Sec  Memory Limit: 128 MBSubmit: 1969  Solved: 639[Submit][Status][Di ...

随机推荐

  1. Flask初级(十一)flash与APScheduler 实现定时任务

    from flask import Flask from flask_apscheduler import APScheduler # 引入APScheduler class Config(objec ...

  2. PHP parse_url 一个好用的函数

    array parse_url ( string $url ) 本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分. 对严重不合格的 URL,parse_url() 可能 ...

  3. 企业信息管理软件 OA、CRM、PM、HR 财务、ERP等

    本文就企业信息管理软件做一个记录. 最近公司要开发物料管理系统....于是查找一些资料 Excel垄断企业信息管理软件二三十年无人撼动:OA.CRM.PM.HR软件不温不火难以普及. 已有的信息化市场 ...

  4. php 易忽略问题

  5. HackPwn:TCL智能洗衣机破解细节分析

    上周结束的Hackpwn上,黑客们脑洞大开,破解了比亚迪汽车.小米手环.乐小宝.长虹电视.TCL洗衣机和九阳豆浆机等一系列最新的智能硬件,据黑客介绍,TCL是一家把家门“砌死”的企业,由于得到了将要被 ...

  6. iOS plist文件的读写

    原帖:http://blog.csdn.net/totogo2010/article/details/7634185 在做iOS开发时,经常用到到plist文件,  那plist文件是什么呢? 它全名 ...

  7. jmeter随笔(34)-WebSocket协议接口测试实战

    2017年春节结束了,一切再次回归到正轨,我们飞测也开始继续分享,小怪在这里预祝大家在2017年工作顺利,满满的收获. 背景:今天研发哥们QQ我,请教websocket协议的接口测试,这哥们自己开发了 ...

  8. cobbler网络装机

    cobbler网络装机 原理分析 cobbler简介 Cobbler通过将设置和管理一个安装服务器所涉及的任务集中在一起,从而简化了系统配置.相当于Cobbler封装了DHCP.TFTP.XINTED ...

  9. IOS沙盒机制

    一,ios应用程序只能在为该程序创建的文件系统中读取文件,不可以去其他地方访问,此区域被称为沙盒 1,每个应用程序都有自己的存储空间 2,应用程序不能翻过自己的围墙去访问别的存储空间的内容. 3,应用 ...

  10. JAVA中static什么作用?

    是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只 ...