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. 如何高效使用Google

    摘自http://simplyy.space/ 核心思想 1.首先,想好你想要寻找什么. 哪些词能够最好地描述你要寻找的信息或者概念? 哪些词是你能够用来替换的? 有没有那些词是可以不必包括在你想要搜 ...

  2. C#实现生产消费者模式

    void test() { int count = 0; // 临界资源区 var queue = new BlockingCollection<string>(); // 生产者线程 T ...

  3. 宇宙最帅叉叉——第五周博客 for 测试与发布(Alpha版本)

    Alpha版本测试报告 1.在测试过程中总共发现了多少Bug?每个类别的Bug分别为多少个? a.修复的BUG UDP传输 recvfrom 当没有消息来的时候一直循环等待因其阻塞 ,时间戳无效了. ...

  4. const关键字的详解

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C++中常用的类型修饰符,常类型是指使用类 ...

  5. 基于jquery,bootstrap数据验证插件bootstrapValidator 教程

    bootstrap:能够增加兼容性的强大框架. 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说. 需要引用css: bootstrap.min.c ...

  6. ListBox item Sort

    将Rss内容读取到Listbox control中, 然后实现按照标题或发布日期进行排序. private void ListItemSort(string type) { if (type == & ...

  7. 【c++基础】vector中按照Point类型某一个变量进行排序

    code // sort(a.begin(), a.end(), cmpy); //subfunction bool cmpy(cv::Point const& a, cv::Point co ...

  8. [LeetCode&Python] Problem 766. Toeplitz Matrix

    A matrix is Toeplitz if every diagonal from top-left to bottom-right has the same element. Now given ...

  9. 数组Arry的随机排序

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  10. Alternative Thinking 找规律

    Kevin has just recevied his disappointing results on the USA Identification of Cows Olympiad (USAICO ...