【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 ...
随机推荐
- asp.net 中 UpdataPanel 的使用注意点
1. 在UpdataPanel 前必须加上asp:ScriptManager的控件,保证页面能够正常显示
- HTML5/CSS3 第三章页面布局
页面布局 1 页面组成 2 布局相关的标签 <div></div> 定义文档中的分区或节 <span></span> 这是一个行内元素,没有任何意义 & ...
- 【CSS】简略说明css的权重之分
/*权重 :id > class > 标签 (小环境) 权重:内联 > 内部 > 外部 (大环境) 小环境处于内部环境中 */ <style> #p1{ /* id ...
- 用iTerm快速链接远程服务器
通常情况下,iTerm2访问远程Linux使用ssh ssh <用户名>@<ip> 然后输入访问的密码即可.当然还有的时候需要指定访问端口. ssh -p <端口号> ...
- 必须使用member initialization list来初始化的情况
// member initialization #include <iostream> using namespace std; class Circle { double radius ...
- mysql-show processlist之writing to net
mysql提示Writing to net解决 最近发现某一个数据库cpu占用比较过.超过200%了. 首先查看数据库慢日志,设定慢日志5秒,基本上没有产生日,没有超过5秒的语句. show proc ...
- Java 关键字volatile 与 synchronized 作用与区别
1,volatile 它所修饰的变量不保留拷贝,直接访问主内存中的. 在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器).为了性能,一个线程会在自己 ...
- linux下编译openjdk8
一.准备工作 1.0 工作环境 Ubuntu 12.04,32位机 1.1.安装JD ...
- Java文件 ---流
分类 根据数据走向,分为输入流.输出流 根据处理的数据类型,分为字节流.字符流 字节流 可以处理所有类型的数据,如MP3.图片.文字.视频等.在读取时,读到一个字节就返回一个字节. 在Java中对应的 ...
- Linux服务器管理员必备Linux命令TOP5
Linux桌面环境的界面友好度.图形性能及附件工具已经大幅进化,然而Linux服务器却还没有能达到这一步. 作为系统管理员必须熟练掌握Linux命令.Linux命令的内容很多,其中的一些TOP命令对于 ...