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> # ...
随机推荐
- from 表单多文本提交不为空
假设需要提交4个文本,均不为空: <form id="form" onsubmit="return check()"> </form> ...
- 【译】第四篇 SQL Server代理配置数据库邮件
本篇文章是SQL Server代理系列的第四篇,详细内容请参考原文. 正如这一系列的前几篇所述,SQL Server代理作业是由一系列的作业步骤组成,每个步骤由一个独立的类型去执行.SQL Serve ...
- Big O
评价一个计算机算法的效率时用到的方法我们称之为Big O(Order of [大约是]). 有序二分查找算法: 比如我们通过二分查找算法查找容器里的10个数据. 那么,我们需要查找一个数据时正常应该是 ...
- Bootstrap文件上传组件:bootstrap fileinput
为了上传预览pdf与图片特用此插件. 源码以及API地址: bootstrap-fileinput源码:https://github.com/kartik-v/bootstrap-fileinput ...
- thinkphp 5.0 代码执行漏洞
https://github.com/vulhub/vulhub/blob/master/thinkphp/5-rce docker-compose -f /home/root/compose.yml ...
- scandir函数的研究【笔记】
以下是本人的学习笔记,代码并非原创,均摘自官方源码,贴出来仅供学习记录用 scandir 的使用要注意内存泄漏的问题 scandir函数实现: vi ./uClibc-0.9.33.2/libc/mi ...
- ORACLE数据库导出导入数据
准备工作: 1.登录管理员system 2.create directory dbdata as 'C:\oracle\tempData';--创建备份文件夹 3.grant read,write o ...
- java并发编程实战笔记---(第五章)基础构建模块
. 5.1同步容器类 1.同步容器类的问题 复合操作,加容器内置锁 2.迭代器与concurrentModificationException 迭代容器用iterator, 迭代过程中,如果有其他线程 ...
- js学习笔记1:语法、数据类型与转换、运算符与运算
注意: 上部代码错误,将停止运行,下部的代码无法显示 typeof 用来定义内容类型,不会输出内容只会输出类型 一.js输出语法 1. 弹窗输出('')内的内容: ...
- 【PAT】1002. 写出这个数 (20)
1002. 写出这个数 (20) 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10100. 输出格式 ...