建颗权值线段树就行了...连离散化都不用...

没加读入优化就TLE, 加了就A掉了...而且还快了接近1/4....

------------------------------------------------------------------------------------------

#include<bits/stdc++.h>
#define rep(i, n) for(int i = 0; i < n; i++)
#define clr(x, c) memset(x, c, sizeof(x))
#define M(l, r) (((l) + (r)) >> 1)
using namespace std;
const int maxn = 1000009; 
struct Node {
Node *l, *r;
bool s;
Node() {
s = false;
}
inline void update() {
s = l->s || r->s;
}
} pool[maxn << 1], *pt = pool, *root;
void build(Node* t, int l, int r) {
if(r > l) {
int m = M(l, r);
build(t->l = pt++, l, m);
build(t->r = pt++, m + 1, r);
}
}
int n, v, type;
void modify(Node* t, int l, int r) {
if(l == r) {
if(type == 1 && !t->s) t->s = true;
if(type == 2 && t->s) t->s = false;
} else {
int m = M(l, r);
v <= m ? modify(t->l, l, m) : modify(t->r, m + 1, r);
t->update();
}
}
int query(Node* t, int l, int r) {
if(!t->s) return 0;
if(l == r) return l;
int m = M(l, r);
return type == 3 ? (t->l->s ? query(t->l, l, m) : query(t->r, m + 1, r)) : 
                  (t->r->s ? query(t->r, m + 1, r) : query(t->l, l, m));
}
int succ(Node* t, int l, int r) {
if(!t->s) return 0;
if(l == r) return l <= v ? 0 : l;
int m = M(l, r);
if(v >= m) return succ(t->r, m + 1, r);
int ans = succ(t->l, l, m);
return ans ? ans : succ(t->r, m + 1, r);
}
int pred(Node* t, int l, int r) {
if(!t->s) return 0;
if(l == r) return l >= v ? 0 : l;
int m = M(l, r);
if(m + 1 >= v) return pred(t->l, l, m);
int ans = pred(t->r, m + 1, r);
return ans ? ans : pred(t->l, l, m);
}
int find(Node* t, int l, int r) {
if(!t->s) return -1;
if(l == r) return 1;
int m = M(l, r);
return v <= m ? find(t->l, l, m) : find(t->r, m + 1, r);
}
inline void read(int &t) {
t = 0;
char c = getchar();
for(; !isdigit(c); c = getchar());
for(; isdigit(c); c = getchar())
   t = t * 10 + c - '0';
}
int main() {
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
int m;
cin >> n >> m;
n++;
build(root = pt++, 1, n);
while(m--) {
read(type);
switch(type) {
case 1 : read(v); v++; modify(root, 1, n); break;
case 2 : read(v); v++; modify(root, 1, n); break;
case 3 : printf("%d\n", query(root, 1, n) - 1); break;
case 4 : printf("%d\n", query(root, 1, n) - 1); break;
case 5 : read(v); v++; printf("%d\n", pred(root, 1, n) - 1); break;
case 6 : read(v); v++; printf("%d\n", succ(root, 1, n) - 1); break;
case 7 : read(v); v++; printf("%d\n", find(root, 1, n)); break;
default : break;
}
}
return 0;
}

------------------------------------------------------------------------------------------

3685: 普通van Emde Boas树

Time Limit: 9 Sec  Memory Limit: 128 MB
Submit: 616  Solved: 216
[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

10 11
1 1
1 2
1 3
7 1
7 4
2 1
3
2 3
4
5 3
6 2

Sample Output

1
-1
2
2
2
-1

HINT

Source

By Zky

转载于:https://www.cnblogs.com/JSZX11556/p/4666047.html

BZOJ 3685: 普通van Emde Boas树( 线段树 )相关推荐

  1. bzoj 3685 普通van Emde Boas树(坑)

    3685: 普通van Emde Boas树 Time Limit: 9 Sec Memory Limit: 128 MB Submit: 1758 Solved: 563 [Submit][Stat ...

  2. BZOJ 3685 普通van Emde Boas树 权值线段树(zkw)

    第一眼看到这题,没错就拿他来做treap的练手了,然而我错了,卡treap,我哭了,写了两三次treap(),这两天几乎都在写数据结构了.后来我又可耻地看了题解,原来这道题已经给了数列中数的范围,可以 ...

  3. van Emde Boas Trees(vEB树)(Introduction to Algorithms, 算法导论,CLRS)学习笔记

    van Emde Boas Trees 1. Predecessor search/ordered sets predecessor: return the nearest left neighbor ...

  4. bzoj3685普通van Emde Boas树 线段树

    3685: 普通van Emde Boas树 Time Limit: 9 Sec  Memory Limit: 128 MB Submit: 1932  Solved: 626 [Submit][St ...

  5. BZOJ3685普通van Emde Boas树

    3685: 普通van Emde Boas树 Time Limit: 9 Sec Memory Limit: 128 MB Submit: 962 Solved: 319 Description 设计 ...

  6. 【bzoj3685】普通van Emde Boas树 线段树

    普通van Emde Boas树 Time Limit: 9 Sec  Memory Limit: 128 MB Submit: 1969  Solved: 639 [Submit][Status][ ...

  7. 算法导论读书笔记(20)van Emde Boas树

    第五部分 高级数据结构 第20章 van Emde Boas树 van Emde Boas树支持优先队列操作以及一些其他操作,每个操作最坏情况运行时间为O(lglgn).而这种数据结构限制关键字必须为 ...

  8. van Emde Boas 树 数据结构说解

    van Emde Boas 树的定义 直观上看,vEB 树保存了一个有序的集合,并支持以 O(lglgn) 的时间复杂度在 vEB 树上进行最小最大值查询.单值存在性查询.单值前驱后继查询.单值插入维 ...

  9. 算法导论-van Emde Boas树

    van Emde Boas树 van Emde Boas树中文名不知道,所以暂且叫它v树吧.v树是一种数据结构,和二叉树.红黑树类似.一种数据结构被创建出来,肯定有其特别的优点,v树的优点就是实现数据 ...

最新文章

  1. IcmpBackDoor
  2. 域名解析的记录类型区别
  3. div+css的布局方式进行设计成品作业_原创响应式php企业成品网站,清晰风格版
  4. 2ab对应的c语言表达式是,编译原理 作业标准答案
  5. Java语言中的----数组
  6. 跨境电商ERP有哪些?
  7. python中ttk详解_Python 中的Property 动态属性和特性详解
  8. “聆听”升级,阿里云智能喜迎首席聆听官
  9. C语言中怎么自动生成时间,在C语言中转换时间的基本方法介绍
  10. ArcGIS数据编辑操作
  11. 正弦余弦怎么用计算机计算公式,关于正弦函数和余弦函数的计算公式
  12. 车牌号测试打分最准确的软件,车牌号码测吉凶准吗?手把手教你选好的车牌号...
  13. STM32日历读取,设置和输出
  14. 科技人文丨爱上陌生人的36个问题
  15. c语言编程镖局运镖,打点
  16. python bind函数_python bind是什么意思
  17. Lua官网及下载地址
  18. 计算机网络国际标准界最,计算机网络标准综述.pdf
  19. RocketMQ Topic/Group/Tags介绍
  20. 《PyInstaller打包实战指南》

热门文章

  1. 基于改进SURF算法的实时视频拼接
  2. 人脸验证 DeepID 算法实践
  3. MacOS开发必备工具brew,安装nginx反向代理,替代linux工具 apt-get和 yum...
  4. Android监听SD卡文件变化
  5. 解除svn控制下的文件夹的svn的控制
  6. 使用UltraWebGrid运行出错处理[原创]
  7. C#通过Array.Clear部分清除数组的代码
  8. 第 3 章 镜像 - 010 - base 镜像
  9. Effective_STL 学习笔记(四十三) 尽量用算法调用代替手写循环
  10. 法官老爷爷在20年的一次判决,竟然彻底改变了一个年轻人的一生!