#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#define space putchar(' ')
#define enter putchar('\n')
using namespace std;
typedef long long ll;
template <class T>
void read(T &x){
char c;
bool op = 0;
while(c = getchar(), c < '0' || c > '9')
if(c == '-') op = 1;
x = c - '0';
while(c = getchar(), c >= '0' && c <= '9')
x = x * 10 + c - '0';
if(op) x = -x;
}
template <class T>
void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x >= 10) write(x / 10);
putchar('0' + x % 10);
} const int N = 100005, INF = 0x3f3f3f3f;
typedef pair<int, int> par;
#define mp make_pair
int n, tot, root;
int ls[N], rs[N], data[N], key[N], sze[N]; void upt(int u){
sze[u] = sze[ls[u]] + sze[rs[u]] + 1;
}
par split(int u, int k){
if(!k) return mp(0, u);
int l = ls[u], r = rs[u];
if(k == sze[l]) return ls[u] = 0, upt(u), mp(l, u);
if(k == sze[l] + 1) return rs[u] = 0, upt(u), mp(u, r);
if(k < sze[l]){
par tmp = split(l, k);
return ls[u] = tmp.second, upt(u), mp(tmp.first, u);
}
par tmp = split(r, k - sze[ls[u]] - 1);
return rs[u] = tmp.first, upt(u), mp(u, tmp.second);
}
int merge(int u, int v){
if(u == 0 || v == 0) return u + v;
if(key[u] < key[v]) return rs[u] = merge(rs[u], v), upt(u), u;
else return ls[v] = merge(u, ls[v]), upt(v), v;
}
int getrank(int u, int x){
int cnt = 0, ans = INF;
while(u){
if(x == data[u]) ans = min(ans, cnt + sze[ls[u]] + 1);
if(x > data[u]) cnt += sze[ls[u]] + 1, u = rs[u];
else u = ls[u];
}
return ans == INF ? cnt : ans;
}
int getkth(int u, int k){
while(1){
if(k == sze[ls[u]] + 1) return data[u];
if(k <= sze[ls[u]]) u = ls[u];
else k -= sze[ls[u]] + 1, u = rs[u]; //先修改k再移动u!我居然又写错了
}
}
int getpre(int u, int x){
int ans = -INF;
while(u){
if(data[u] < x) ans = max(ans, data[u]), u = rs[u];
else u = ls[u];
}
return ans;
}
int getnxt(int u, int x){
int ans = INF;
while(u){
if(data[u] > x) ans = min(ans, data[u]), u = ls[u];
else u = rs[u];
}
return ans;
}
void insert(int x){
data[++tot] = x, key[tot] = rand(), sze[tot] = 1;
int k = getrank(root, x);
par tmp = split(root, k);
root = merge(tmp.first, tot);
root = merge(root, tmp.second);
}
void erase(int x){
int k = getrank(root, x);
par tmp1 = split(root, k);
par tmp2 = split(tmp1.first, k - 1);
root = merge(tmp2.first, tmp1.second);
} int main(){
srand(20010424);
read(n);
int op, x;
while(n--){
read(op), read(x);
if(op == 1) insert(x);
else if(op == 2) erase(x);
else if(op == 3) write(getrank(root, x)), enter;
else if(op == 4) write(getkth(root, x)), enter;
else if(op == 5) write(getpre(root, x)), enter;
else write(getnxt(root, x)), enter;
}
return 0;
}

无旋treap板子!的更多相关文章

  1. [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)

    转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...

  2. [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)

    今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和treap一样简单易懂,同时还支持可持久化. 无旋treap的节点定义和treap一样,都要同时满足树性质和堆性质,我 ...

  3. [转载]无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )

    转自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182631.html 1500: [NOI2005]维修数列 Time Limit: 10 Sec  Mem ...

  4. Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...

  5. 【算法学习】Fhq-Treap(无旋Treap)

    Treap——大名鼎鼎的随机二叉查找树,以优异的性能和简单的实现在OIer们中广泛流传. 这篇blog介绍一种不需要旋转操作来维护的Treap,即无旋Treap,也称Fhq-Treap. 它的巧妙之处 ...

  6. 无旋treap的区间操作实现

    最近真的不爽...一道维修数列就做了我1上午+下午1h+1晚上+晚上1h+上午2h... 一道不错的自虐题... 由于这一片主要讲思想,代码我放这里了 不会无旋treap的童鞋可以进这里 呵呵... ...

  7. 无旋treap的简单思想以及模板

    因为学了treap,不想弃坑去学splay,终于理解了无旋treap... 好像普通treap没卵用...(再次大雾) 简单说一下思想免得以后忘记.普通treap因为带旋转操作似乎没卵用,而无旋tre ...

  8. [BZOJ3223]文艺平衡树 无旋Treap

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...

  9. [您有新的未分配科技点] 无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MB Description Input 输入的第1 行包含两个数N 和M(M ≤20 ...

随机推荐

  1. x window的奥秘

    阅读目录 了解自己机器上的 X Window 理解 display 和虚拟控制台 远程连接 X Server 理解 lightdm 和 X Window 桌面环境的启动过程 搞定 xauth X Se ...

  2. Bagging(R语言实现)—包外错误率,多样性测度

    1.      Bagging Bagging即套袋法,其算法过程如下: 从原始样本集中抽取训练集.每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次 ...

  3. W25Q128---读写

    占坑! 总结:通信方式是SPI,读数据可以从任何地方读,写数据和擦出数据需要按照页或者扇区或者簇为单位进行. 写数据:一次最多写一页,如果超出一页数据长度,则分几次完成.例如本芯片一个扇区为4096个 ...

  4. python 回溯法 子集树模板 系列 —— 3、0-1背包问题

    问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得放入背包的物品的总价值为最大? 分析 显然,放入背包的物品,是N个物品的所有子集的其 ...

  5. 阿里云代金券 - 双12疯了~~~ 4核8G 3M带宽只要1890元/3年

    阿里云双12大促简直疯了,4核8G 3M带宽只要1890元/3年,比双11疯狂多了,双11没有上车的赶快来买吧!!! 前去阿里云双12活动页面 截图如下: 从截图中可以看出,不仅4核8G降到了地板,1 ...

  6. Webpack学习-Webpack初识

    一.前言 webpack 到底是个什么东西呢,看了一大堆的文档,没一个能看懂的,因为上来就是给个module.exports 然后列一大堆配置,这个干啥,那个干啥,没一点用.但凡要用一个东西,一个东西 ...

  7. 《HTTP权威指南》读书笔记:缓存

    缓存的定义 Web缓存是可以自动保存常见文档副本的HTTP设备(包括浏览器?) 缓存的作用 减少冗余数据传输 缓解带宽瓶颈(很多网络为本地网络客户端提供的带宽比为远程服务器提供的带宽要宽) 缓解瞬时拥 ...

  8. Git提交空目录

    1.git仅跟踪文件的变动,不跟踪目录.如果需要提交空目录,可以在里面添加 .gitignore 文件,方法如下: find . -type d -empty -exec touch {}/.giti ...

  9. OpenGL(3)-三角形

    写在前面 从这节开始,会接触到很多基本概念,原书我也是读了很多遍,一遍一遍去理解其中的意思,以及他们之间的关系. 概念 顶点数组对象:VAO 顶点缓冲对象:VBO 索引缓冲对象:EBO|IBO Ope ...

  10. Istio 流量治理功能原理与实战

    一.负载均衡算法原理与实战 负载均衡算法(load balancing algorithm),定义了几种基本的流量分发方式,在Istio中共有4种标准负载均衡算法. •Round_Robin: 轮询算 ...