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. 无线Mesh网络技术基础与应用

    无线Mesh网络主要包含三类节点,构成了Mesh的基本服务集. 1.与有线网络相连的节点(GateWay节点),其主要负责实现无线Mesh网络和有线网络的数据交换. 2.可以进行Mesh组网并拥有Ro ...

  2. 设置MyEclipse字体大小

    设置MyEclipse字体大小

  3. spring集成redis——主从配置以及哨兵监控

    Redis主从模式配置: Redis的主从模式配置是非常简单的,首先我们需要有2个可运行的redis环境: master node : 192.168.56.101 8887 slave node: ...

  4. chrome安装HostAdmin app

    之前在chrome应用商店搜索HostAdmin App就可以搜到,最近发现搜不到了:可以按照下面的步骤进行安装. 1.找个安装有HostAdmin App的电脑,然后在chrome的扩展程序中找到它 ...

  5. LSTM神经网络

    LSTM是什么 LSTM即Long Short Memory Network,长短时记忆网络.它其实是属于RNN的一种变种,可以说它是为了克服RNN无法很好处理远距离依赖而提出的. 我们说RNN不能处 ...

  6. [LeetCode&Python] Problem 412. Fizz Buzz

    Write a program that outputs the string representation of numbers from 1 to n. But for multiples of ...

  7. CTF中图片隐藏文件分离方法

    CTF中图片隐藏文件分离方法   0x01 分析 这里我们以图片为载体,给了这样的一样图片:2.jpg 首先我们需要对图片进行分析,这里我们需要用到kali里面的一个工具 binwalk ,想要了解这 ...

  8. hdu1257 dp(最长上升子序列)

    题意:有一种拦截系统,可以打击导弹,但是打击的高度会逐渐下降,因此为了防御导弹攻击,就必须用多个系统,现给出一列导弹依次的高度,求最少需要的系统数. 这道题是最长上升子序列问题,但是我一开始其实并没有 ...

  9. (转) C++中成员初始化列表的使用

    C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point{private: int x,y;public ...

  10. Linux(CentOS)搭建SVN服务器

    1.安装命令 yum -y install subversion 查看SVN安装位置 rpm -ql subversion 查看SVN版本 svnserve --version 2.创建版本库根目录( ...