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. Yii1.1测试环境配置(一)

    一.安装wampserver wampserver集成了PHP.Apacha.MySql,可以省去分别安装的麻烦.wampserver的安装配置方法可以自行搜索. wampserver安装完成后需要手 ...

  2. ReentrantReadWriteLock——读读共享(一)

    多个线程可以同时读,读读是异步的.非互斥的 1.Service.java(封装的方法,供线程A和B访问) package ReentrantReadWriteLock; import java.uti ...

  3. tf.nn的conv2d卷积与max_pool池化

    tf.nn.conv2d(value,filter,strides,[...]) 对于图片来说 value :   形状通常是np.array()类型的4维数组也称tensor(张量),  (batc ...

  4. zabbix监控系统的应用---数据监控、导入模板、告警

    一.zabbix监控nginx服务 1)在server2中安装nginx服务 --->  rpm  -ivh  nginx-1.8.0-1.el6.ngx.x86_64.rpm 2)编辑配置文件 ...

  5. 第三课 操作系统开发之x86模拟环境搭建

    前面我们讲解了主引导程序的加载过程,并且制作了虚拟软盘a.img,最终这个主引导程序也在机器中成功运行了,但是实际开发的时候,并不会如此简单,免不了调试过程,如果还像上一节中直接将软盘放到机器中去加载 ...

  6. Java Iterator的一般用法

    Iterator(迭代器) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为“轻量级”对象,因为创建它的代价小. Java中的I ...

  7. U-Boot_bmp_logo_hacking

    /*********************************************************************** * U-Boot_bmp_logo_hacking * ...

  8. WinRAR备份技巧 - imsoft.cnblogs

    RAR控制台日常备份策略 run.batrar a -ep1 -agYYYY{年}MM{月}DD{日} 备份 @list.txt-ep1是忽略原文件路径,rar包里是一堆文件,没有目录结构-ag附加命 ...

  9. Android Studio - 安卓开发工具 打开后报错集合、修复指南

    安卓开发工具错误修复 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心创新 ...

  10. CodeForces - 645F:Cowslip Collections (组合数&&欧拉函数)

    In an attempt to make peace with the Mischievious Mess Makers, Bessie and Farmer John are planning t ...