【bzoj3685】普通van Emde Boas树 线段树
普通van Emde Boas树
Time Limit: 9 Sec Memory Limit: 128 MB
Submit: 1969 Solved: 639
[Submit][Status][Discuss]
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
Output
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
HINT
Source
题解:
很多数据结构都可以解决。
权值线段树就可以。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath> #define N 3000007 using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} int n,m;
struct seg
{
int l,r,v;
}t[N]; void build(int k,int l,int r)
{
t[k].l=l;t[k].r=r;
if(l==r)return;
int mid=(l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
}
int mn(int k)
{
if(!t[k].v)return -;
int l=t[k].l,r=t[k].r;
if(l==r)return l;
if(t[k<<].v)return mn(k<<);
else return mn(k<<|);
}
int mx(int k)
{
if(!t[k].v)return -;
int l=t[k].l,r=t[k].r;
if(l==r)return l;
if(t[k<<|].v)return mx(k<<|);
else return mx(k<<);
}
void insert(int k,int val)
{
int l=t[k].l,r=t[k].r;
if(l==r){t[k].v=;return;}
int mid=(l+r)>>;
if(val<=mid)insert(k<<,val);
else insert(k<<|,val);
t[k].v=t[k<<].v+t[k<<|].v;
}
int find(int k,int val)
{
int l=t[k].l,r=t[k].r;
if(l==r)
{
if(t[k].v)return ;
return -;
}
int mid=(l+r)>>;
if(val<=mid)return find(k<<,val);
else return find(k<<|,val);
}
void del(int k,int val)
{
int l=t[k].l,r=t[k].r;
if(l==r){t[k].v=;return;}
int mid=(l+r)>>;
if(val<=mid)del(k<<,val);
else del(k<<|,val);
t[k].v=t[k<<].v+t[k<<|].v;
}
int findpr(int k,int val)
{
if(val<)return -;
if(!t[k].v)return -;
int l=t[k].l,r=t[k].r;
if(l==r)return l;
int mid=(l+r)>>;
if(val<=mid)return findpr(k<<,val);
else
{
int t=findpr(k<<|,val);
if(t==-)return mx(k<<);
else return t;
}
}
int findsu(int k,int val)
{
if(!t[k].v)return -;
int l=t[k].l,r=t[k].r;
if(l==r)return l;
int mid=(l+r)>>;
if(val>mid)return findsu(k<<|,val);
else
{
int t=findsu(k<<,val);
if(t==-)return mn(k<<|);
else return t;
}
}
int main()
{
n=read(),m=read();
build(,,n);
int opt,x;
for(int i=;i<=m;i++)
{
opt=read();
switch(opt)
{
case :x=read();if(find(,x)==-)insert(,x);break;
case :x=read();if(find(,x)==)del(,x);break;
case :printf("%d\n",mn());break;
case :printf("%d\n",mx());break;
case :x=read();printf("%d\n",findpr(,x-));break;
case :x=read();printf("%d\n",findsu(,x+));break;
case :x=read();printf("%d\n",find(,x));break;
}
}
}
【bzoj3685】普通van Emde Boas树 线段树的更多相关文章
- bzoj3685普通van Emde Boas树 线段树
3685: 普通van Emde Boas树 Time Limit: 9 Sec Memory Limit: 128 MBSubmit: 1932 Solved: 626[Submit][Stat ...
- 【权值分块】bzoj3685 普通van Emde Boas树
权值分块,虽然渐进复杂度不忍直视,但其极小的常数使得实际运行起来比平衡树快,大多数情况和递归版权值线段树差不多,有时甚至更快.但是被zkw线段树完虐. #include<cstdio> # ...
- BZOJ3685: 普通van Emde Boas树
显然这题的所有操作都可以用set,但是直接用set肯定要T,考虑到读入量较大,使用fread读入优化,就可以卡过去了. #include<bits/stdc++.h> using name ...
- BZOJ 3685: 普通van Emde Boas树( 线段树 )
建颗权值线段树就行了...连离散化都不用... 没加读入优化就TLE, 加了就A掉了...而且还快了接近1/4.... ---------------------------------------- ...
- BZOJ_3685_普通van Emde Boas树_权值线段树
BZOJ_3685_普通van Emde Boas树_权值线段树 Description 设计数据结构支持: 1 x 若x不存在,插入x 2 x 若x存在,删除x 3 输出当前最小值,若不存 ...
- bzoj 3685: 普通van Emde Boas树
3685: 普通van Emde Boas树 Description 设计数据结构支持:1 x 若x不存在,插入x2 x 若x存在,删除x3 输出当前最小值,若不存在输出-14 输出当 ...
- 浅谈 van Emde Boas 树——从 u 到 log log u 的蜕变
本文参考算法导论完成. 模板题在此 QwQ 优化的过程比较长,还请读者耐心阅读,认真理解. 最初的想法 我会暴力! 用一个 \(size\) 数组维护每个元素出现的次数. 不细讲,时间复杂度 \(O( ...
- 算法导论笔记——第二十章 van Emde Boas树
当关键字是有界范围内的整数时,能够规避Ω(lglgn)下界的限制,那么在类似的场景下,我们应弄清楚o(lgn)时间内是否可以完成优先队列的每个操作.在本章中,我们将看到:van Emde Boas树支 ...
- Van Emde Boas Tree
van Emde Boas trees 支持所有优先级优先级队列的操作,并且巧妙的是它对于SEARCH, INSERT,DELETE,MINIMUM,MAXMUN,SUCCESSOR,和PREDECE ...
随机推荐
- Spring学习记录(二)
1.Spring中的AOP思想 aop思想:横向重复,纵向抽取. AOP(Aspect-OrientedProgramming,面向切面编程),AOP包括切面(Aspect),通知(Advice),连 ...
- XML格式与实体类的转换
背景 本人头一回写博客,请大家多多关照.通过读取XML文件获取用户管理权限,其中涉及三部分: 1.XML文件的生成: 2.XML文件的读取: 3.XML文件的保存: 如何做 第一步:自己先将XML文件 ...
- 对于新能源Can数据、电池BMS等字节和比特位的解析
1.对于1个字节(8个bit)以上的数据需要先进行倒序(因为高位在前 低位在后). CanID CanData 排序后的 字节数据 十进制 分辨率(0.005) 偏移量(40) 0x18FEC117 ...
- java.lang.ClassCastException: com.sun.proxy.$Proxy53 cannot be cast to cn.service.impl.WorkinggServiceImpl
java.lang.ClassCastException: com.sun.proxy.$Proxy53 cannot be cast to cn.service.impl.WorkinggServi ...
- windows下CMD命令大全(仅供参考)
CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本.文件系统版本)chcp 修改默认字符集chcp 936默认中文chcp 650011. appwiz.c ...
- 致敬wusir懒孩子自有懒孩子的生存之道之二
https://www.cnblogs.com/wupeiqi/ https://www.cnblogs.com/Eva-J/ https://www.cnblogs.com/wupeiqi/p/90 ...
- Flask初学者:g对象,hook钩子函数
Flask的g对象 作用:g可以可以看作是单词global的缩写,使用“from flask import g”导入,g对象的作用是保存一些在一次请求中多个地方的都需要用到的数据,这些数据可能在用到的 ...
- Codeforces Round #462 (Div. 2) D. A Determined Cleanup
D. A Determined Cleanup time limit per test1 second memory limit per test256 megabytes Problem Descr ...
- HashTable, HashMap,TreeMap区别
java为数据结构中的映射定义了一个接口java.util.Map,而HashMap Hashtable和TreeMap就是它的实现类.Map是将键映射到值的对象,一个映射不能包含重复的键:每个键最多 ...
- 《鸟哥的Linux私房菜》学习笔记(5)——权限管理
一.权限的基本概念 权限:访问计算机资源或服务的访问能力. Linux中,每一个资源或者服务的权限, ...