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线段树略快一点,内存也省了很多。

#include<cstdio>
inline int read(){
char c=getchar();
int x=;
while(c>''||c<'')c=getchar();
while(c>=''&&c<='')
x=x*+c-'',c=getchar();
return x;
}
char str[];
inline void print(int x){
if(!x){
puts("");
return;
}
if(x<)putchar('-'),x=-x;
int p=;
while(x)str[p++]=x%+'',x/=;
while(p)putchar(str[--p]);
putchar();
}
bool d[];
unsigned char ds[][];
int lp[],rp[];
int ls[],rs[];
inline void ins(int x){
if(d[x])return;
d[x]=;
for(int i=;i<=;i++)ds[i][x>>i*]|=<<((x>>i*-)&);
}
inline void del(int x){
if(d[x])d[x]=;
else return;
for(int i=;i<=;i++)if(ds[i][x>>i*]^=<<((x>>i*-)&))return;
}
inline int minv(){
if(!ds[][])return -;
register int p=lp[ds[][]];
for(int i=;i;--i)p=(p<<)+lp[ds[i][p]];
return p;
}
inline int maxv(){
if(!ds[][])return -;
register int p=rp[ds[][]];
for(int i=;i;--i)p=(p<<)+rp[ds[i][p]];
return p;
}
inline int prv(int p){
if(!ds[][])return -;
register int s=ds[][p>>]&ls[p&];
if(s)return (p^(p&))|rp[s];
for(int i=;i<=;i++){
p>>=;
s=ds[i][p>>]&ls[p&];
if(s){
p=(p^(p&))|rp[s];
for(int j=i-;j;--j)p=(p<<)|rp[ds[j][p]];
return p;
}
}
return -;
}
inline int nxt(int p){
if(!ds[][])return -;
register int s=ds[][p>>]&rs[p&];
if(s)return (p^(p&))|lp[s];
for(int i=;i<=;i++){
p>>=;
s=ds[i][p>>]&rs[p&];
if(s){
p=(p^(p&))|lp[s];
for(int j=i-;j;--j)p=(p<<)|lp[ds[j][p]];
return p;
}
}
return -;
}
int n,m,a,b;
int main(){
for(int i=;i<;i++){
int j=;
while(!(i&<<j))++j;
lp[i]=j;
j=;
while(!(i&<<j))--j;
rp[i]=j;
}
for(int i=;i<;i++)ls[i]=>>-i,rs[i]=&(<<i+);
n=read();
m=read();
for(int i=;i<m;i++){
a=read();
if(a<){
b=read();
if(a==)ins(b);
else if(a==)del(b);
}else if(a>){
b=read();
if(a==)print(prv(b));
else if(a==)print(nxt(b));
else if(a==)puts(d[b]&&ds[][b>>]&<<(b&)?"":"-1");
}else if(a==)print(minv());
else if(a==)print(maxv()); }
return ;
}

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. anroid学习目录总结

    当前标签: Android开发学习总结   Android开发学习总结(六)—— APK反编译 孤傲苍狼 2015-07-26 12:48 阅读:4245 评论:5     Android开发学习总结 ...

  2. 前端:jQuery笔记

    前端:jQuery笔记 此系列文章乃是学习jQuery的学习笔记. Asp.net MVC Comet推送 摘要: 一.简介 在Asp.net MVC实现的Comet推送的原理很简单. 服务器端:接收 ...

  3. 返回书签 GotoBookmark

    property Bookmark: TBookmark read GetBookmark write GotoBookmark; 直接给Bookmark属性赋值,还是 调用数据集GotoBookma ...

  4. 基于struts2和hibernate的登录和注册功能——完整实例

    1.该项目使用MySQL数据库,数据库名为test,表名info,如图所示: 2.配置web.xml(Struts2使用) <?xml version="1.0" encod ...

  5. hibernate多对一和一对多关联

    关联,是类的实例之间的关系,表示有意义和值得关注的连接. 多对一单向关联: 单向多对一:<many-to-one>定义一个持久化类与另一个持久化类的关联这种关联是数据表间的多对一关联,需要 ...

  6. the usage of String

    经典算法:(整理汇总) 1)如何快速倒叙: public static char[] reverseArray(char[] c){ char t; for(int i=0;i<c.length ...

  7. spring 定时任务参数配置详解

    注:本文摘自<Quartz Cron 触发器 Cron Expression 的格式>http://blog.csdn.net/yefengmeander/article/details/ ...

  8. macOS 使用brew安装mysql,客户端连接不上

    macos 使用brew安装mysql8.0后,使用mysql官方的workbench连接不上,出现√ mysql8.0 Authentication plugin 'caching_sha2_pas ...

  9. Vue CLI 3 配置兼容IE10

    最近做了一个基于Vue的项目,需要兼容IE浏览器,目前实现了打包后可以在IE10以上运行,但是还不支持在运行时兼容IE10及以上. 安装依赖 yarn add --dev @babel/polyfil ...

  10. 6.2 socket 流协议与粘包

    TCP IP协议是流协议,对上层协议来讲是没有边界的,主机A发送两个消息M1和M2,如下图所示: 主机A发送了M1和M2,主机B在接收时有4种情况: 1.先收了M1,又收了M2 2.M1.M2一起收到 ...