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

没加读入优化就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

BZOJ 3685: 普通van Emde Boas树( 线段树 )的更多相关文章

  1. bzoj 3685: 普通van Emde Boas树

    3685: 普通van Emde Boas树 Description 设计数据结构支持:1 x  若x不存在,插入x2 x  若x存在,删除x3    输出当前最小值,若不存在输出-14    输出当 ...

  2. 【模板】BZOJ 3685: 普通van Emde Boas树——Treap

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3685 据说神犇都是用zkw线段树水过的啊... 我蒟蒻只会写treap,加了fread之后8 ...

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

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

  4. BZOJ_3685_普通van Emde Boas树_权值线段树

    BZOJ_3685_普通van Emde Boas树_权值线段树 Description 设计数据结构支持: 1 x  若x不存在,插入x 2 x  若x存在,删除x 3    输出当前最小值,若不存 ...

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

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

  6. 浅谈 van Emde Boas 树——从 u 到 log log u 的蜕变

    本文参考算法导论完成. 模板题在此 QwQ 优化的过程比较长,还请读者耐心阅读,认真理解. 最初的想法 我会暴力! 用一个 \(size\) 数组维护每个元素出现的次数. 不细讲,时间复杂度 \(O( ...

  7. 算法导论笔记——第二十章 van Emde Boas树

    当关键字是有界范围内的整数时,能够规避Ω(lglgn)下界的限制,那么在类似的场景下,我们应弄清楚o(lgn)时间内是否可以完成优先队列的每个操作.在本章中,我们将看到:van Emde Boas树支 ...

  8. Van Emde Boas Tree

    van Emde Boas trees 支持所有优先级优先级队列的操作,并且巧妙的是它对于SEARCH, INSERT,DELETE,MINIMUM,MAXMUN,SUCCESSOR,和PREDECE ...

  9. [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+并查集+启发式合并)

    [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中 ...

随机推荐

  1. Android_Dialog_设置Dialog窗体的大小

    /** * 设置Dialog窗体的大小 */ private void setWindowSize() { DisplayMetrics dm = new DisplayMetrics(); Wind ...

  2. PHP面试题汇总参考

    PHP面试题汇总 这是一份比较全面的PHP面试题.对准备去新公司应聘PHP职位的开发者应该有帮助.或者说,对招聘PHP开发人员的企业也有些帮助,不过就不要原样打印出来考了,稍微改一改. 简述题(50分 ...

  3. js中访问对象的方法

    如果在js中定义了一个变量obj1,如 var obj1 = 234; 那么访问这个边个两的方式至少有两种, 1 window["obj1"],那么值为234, 2 var tar ...

  4. MVC+ADO模式

    MVC+DAO设计模式 博客分类: Java Java WEB开发   MVC+DAO设计模式 本文摘自:http://www.paper.edu.cn    基于MVC+DAO设计模式的Struts ...

  5. QT实现窗口缩放打开与关闭(重叠窗口,太有意思了)

    基本思想:假设A为主窗口,B为子窗口.A打开或关闭时,先对A窗口进行截图,然后将图片部满整个B窗口的,在paintEvent里面进行动态缩放或放大画图.最后使用动画,将B窗口以动画的形式打开或关闭,动 ...

  6. 用macports装了一份openssl

    我已经用macports装了一份openssl,然后自己又编译了一份openssl....第三方给Mac出的一个类似BSD Ports的一个软件包管理工具装的话只需要sudo port install ...

  7. maven GroupID和ArtifactID填什么

    GroupID是项目组织唯一的标识符,实际对应JAVA的包的结构,是main目录里java的目录结构. ArtifactID就是项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称.一般Gro ...

  8. VC++网络高级编程

    内含<VC网络高级编程>电子书 及源代码. 第一章.TCP/IP协议.第二章.Winsock网络编程接口:第二章.Visual C++与网络编程:第四章.基本网络编程技术:第五章.Teln ...

  9. ThinkPHP - 模板使用函数

    模板使用函数 1.模板引擎自带函数:仅仅是输出变量并不能满足模板输出的需要,内置模板引擎支持对模板变量使用调节器和格式化功能,其实也就是提供函数支持,并支持多个函数同时使用.用于模板标签的函数可以是P ...

  10. 【Eclipse】报错提示删掉@Override

    是因为项目的JRE System Library版本不对,点击Edit进入Edit Library 界面,因为项目默认是使用Eclipse自带的jdk版本(Workspace default JRE) ...