bzoj 3685: 普通van Emde Boas树
3685: 普通van Emde Boas树
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
Sample Input
1 1
1 2
1 3
7 1
7 4
2 1
3
2 3
4
5 3
6 2
Sample Output
-1
2
2
2
-1
Source
题解:
vEB树是什么东东???。。。。
按照题目描述用线段树做就好了。。。。
按0~n划分区间,记录区间中存在的数的个数。
提一下前驱的找法:
对于x,在整个区间内找x-1,每次递归的两次区间,如果x-1在左区间,那么直接递归左区间,如果在右区间,判断右区间有无答案,没有的话则当前答案是左区间内的最大值。
后继的话找法差不多。。
#include<stdio.h>
#include<iostream>
using namespace std;
const int N=1000005;
#define p1 (p<<1)
#define p2 (p<<1|1)
int n,m,i,p,x,t[N<<2];
inline void read(int &v){
char ch,fu=0;
for(ch='*'; (ch<'0'||ch>'9')&&ch!='-'; ch=getchar());
if(ch=='-') fu=1, ch=getchar();
for(v=0; ch>='0'&&ch<='9'; ch=getchar()) v=v*10+ch-'0';
if(fu) v=-v;
}
void update(int l,int r,int x,int y,int p)
{
if(l==r)
{
t[p]=y;
return;
}
int mid=(l+r)>>1;
if(x<=mid) update(l,mid,x,y,p1);else update(mid+1,r,x,y,p2);
t[p]=t[p1]+t[p2];
}
int Min(int l,int r,int p)
{
if(!t[p]) return -1;
if(l==r) return l;
int mid=(l+r)>>1;
if(t[p1]) return Min(l,mid,p1);else return Min(mid+1,r,p2);
}
int Max(int l,int r,int p)
{
if(!t[p]) return -1;
if(l==r) return l;
int mid=(l+r)>>1;
if(t[p2]) return Max(mid+1,r,p2);else return Max(l,mid,p1);
}
int find(int l,int r,int x,int p)
{
if(!t[p]) return -1;
if(l==r) return 1;
int mid=(l+r)>>1;
if(x<=mid) return find(l,mid,x,p1);else return find(mid+1,r,x,p2);
}
int pre(int l,int r,int x,int p)
{
if(x<0) return -1;
if(!t[p]) return -1;
if(l==r) return l;
int mid=(l+r)>>1;
if(x<=mid) return pre(l,mid,x,p1);else
{
int tmp=pre(mid+1,r,x,p2);
if(tmp==-1) return Max(l,mid,p1);else return tmp;
}
}
int last(int l,int r,int x,int p)
{
if(x>n) return -1;
if(!t[p]) return -1;
if(l==r) return l;
int mid=(l+r)>>1;
if(x>mid) return last(mid+1,r,x,p2);else
{
int tmp=last(l,mid,x,p1);
if(tmp==-1) return Min(mid+1,r,p2);else return tmp;
}
}
int main()
{
read(n),read(m);
for(i=1;i<=m;i++)
{
read(p);
if(p==1)
{
read(x);
update(0,n,x,1,1);
} else
if(p==2)
{
read(x);
update(0,n,x,0,1);
} else
if(p==3) printf("%d\n",Min(0,n,1));else
if(p==4) printf("%d\n",Max(0,n,1));else
if(p==7)
{
read(x);
printf("%d\n",find(0,n,x,1));
} else
if(p==5)
{
read(x);
printf("%d\n",pre(0,n,x-1,1));
} else
{
read(x);
printf("%d\n",last(0,n,x+1,1));
}
}
return 0;
}
bzoj 3685: 普通van Emde Boas树的更多相关文章
- BZOJ 3685: 普通van Emde Boas树( 线段树 )
		
建颗权值线段树就行了...连离散化都不用... 没加读入优化就TLE, 加了就A掉了...而且还快了接近1/4.... ---------------------------------------- ...
 - 【模板】BZOJ 3685: 普通van Emde Boas树——Treap
		
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3685 据说神犇都是用zkw线段树水过的啊... 我蒟蒻只会写treap,加了fread之后8 ...
 - bzoj3685普通van Emde Boas树 线段树
		
3685: 普通van Emde Boas树 Time Limit: 9 Sec Memory Limit: 128 MBSubmit: 1932 Solved: 626[Submit][Stat ...
 - BZOJ_3685_普通van Emde Boas树_权值线段树
		
BZOJ_3685_普通van Emde Boas树_权值线段树 Description 设计数据结构支持: 1 x 若x不存在,插入x 2 x 若x存在,删除x 3 输出当前最小值,若不存 ...
 - 【bzoj3685】普通van Emde Boas树 线段树
		
普通van Emde Boas树 Time Limit: 9 Sec Memory Limit: 128 MBSubmit: 1969 Solved: 639[Submit][Status][Di ...
 - 算法导论笔记——第二十章 van Emde Boas树
		
当关键字是有界范围内的整数时,能够规避Ω(lglgn)下界的限制,那么在类似的场景下,我们应弄清楚o(lgn)时间内是否可以完成优先队列的每个操作.在本章中,我们将看到:van Emde Boas树支 ...
 - 浅谈 van Emde Boas 树——从 u 到 log log u 的蜕变
		
本文参考算法导论完成. 模板题在此 QwQ 优化的过程比较长,还请读者耐心阅读,认真理解. 最初的想法 我会暴力! 用一个 \(size\) 数组维护每个元素出现的次数. 不细讲,时间复杂度 \(O( ...
 - 【BZOJ3685】【zkw权值线段树】普通van Emde Boas树
		
原题传送门 因为马上要开始搞树套树了,所以学了一波权值线段树...毕竟是会点zkw线段树的,所以zkw线段树大法好! 解题思路: 介绍一下权值线段树吧,其实感觉就是线段树的本义,就是你用线段树维护了数 ...
 - 【权值分块】bzoj3685 普通van Emde Boas树
		
权值分块,虽然渐进复杂度不忍直视,但其极小的常数使得实际运行起来比平衡树快,大多数情况和递归版权值线段树差不多,有时甚至更快.但是被zkw线段树完虐. #include<cstdio> # ...
 
随机推荐
- 使用infinite-scroll实现Ghost博文列表的滚动加载
			
Ghost博客系统默认提供的博文列表为传统的翻页方式(通过点击上一页.下一页等按钮来切换),随着移动客户端的发展,瀑布流式的滚动加载方式得到广泛应用,有效地提高了用户浏览信息的流畅度.下面详述如何通过 ...
 - js小记:对象、原型及原型链、面向对象编程
			
一.js对象 1.js对象 js对象是一种复合数据类型,它可以把多个(不同类型的)数据集中在一个变量中,并且给每个数据起名字. 2.对象与数组 对象的每个数据有对应的名字(属性名),我们通过叫名字访问 ...
 - python初步学习-python函数 (二)
			
几个特殊的函数(待补充) python是支持多种范型的语言,可以进行所谓函数式编程,其突出体现在有这么几个函数: filter.map.reduce.lambda.yield lambda >& ...
 - thinkphp crud实例代码
			
class IndexAction extends Action { // 查询数据 public function index() { $Form = M("Form"); $l ...
 - weblogic 包里面有中文文件名 会报错
			
目前:没有解决,只要有中文启动就报错 http://bbs.csdn.net/topics/10055670 http://www.2cto.com/os/201406/311394.html
 - React 16 源码瞎几把解读 【前戏】 为啥组件外面非得包个标签?
			
〇.看前准备 1.自行clone react最新代码 2.自行搭建一个能跑react的test项目 一.看表面:那些插件 如何解析JSX 有如下一段代码: // ---- hearder.jsx 组件 ...
 - Linux中切换用户变成-bash4.1-$的解决方法
			
原因是root在/root下面的几个配置文件丢失,将/etc/skel/目录下的三个文件拷贝到用户家目录即可 cp /etc/skel/.bashrc /root/ cp /etc/skel/.bas ...
 - sicily 1193. Up the Stairs
			
Time Limit: 1sec Memory Limit:32MB Description John is moving to the penthouse of a tall sky-scr ...
 - python 异常知识点
			
raise from python 在3.0 之后引入了raise from 表达式: raise exception from otherexception 当使用该语法时,第二个表达式指定了另一个 ...
 - 关于boost 的smart_ptr 的使用问题
			
boost 的smart_ptr 库中含有好几种智能指针,大家用的最多的应该是shared_ptr ,为啥呢?好用,不用管他啥时候会自动删除等等,而且拷贝和复制都很到位, 但实际上,这个库也有问题,连 ...