#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. odoo开发思路篇

    1.首先从客户那了解需求,知道他现有系统所能实现的功能,现在要求要实现的功能,至于怎样实现由我们自己去定.(拿到需求------->了解需求功能--------->自己实现的方法) 2.在 ...

  2. MView的DDL查找:

    Select dbms_metadata.get_ddl('MATERIALIZED_VIEW','MVIEW_NAME') from dual:

  3. MiZ702学习笔记9——XADC采集片上数据PS版

    这次借助zynq的内嵌的XADC来采集zynq内部的一些参数: •VCCINT:内部PL核心电压 •VCCAUX:辅助PL电压 •VREFP:XADC正参考电压 •VREFN:XADC负参考电压 •V ...

  4. libgdx学习记录5——演员Actor

    Actor也是libgdx中非常重要的一个元素,一般与stage配合一起使用.Actor能够设置大小,位置,旋转和动画等. 我们自定义的Actor一般需要继承于Actor,并且重写其中的act和dra ...

  5. 生成本地测试用https证书,支持通配符和多域名,初学OpenSSL

    18-01-26在v2ex上看到一妹纸发的<身为一个 21 岁的年轻程序员,我已经腰突了(躺>,哈哈,感同身受,想到这几天我左腿麻木持续了好几天,前几天屁股疼的只要坐下就站不起来,不过站着 ...

  6. 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context}Setting property 'source' to 'org.eclipse

    当你用Eclipse运行web项目的时候,你就会看到控制台出现:WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Set ...

  7. 【Tableau】电商广告投放的地域分析

    分析师的职责是利用处理数据获取信息,提炼规律,帮助企业正确决策业务方向. 所以,一个好的分析师绝不能被数据所困,既要深入业务,理解业务,也要高瞻远瞩,以领导者的思维借助数据分析的辅助做出判断. [结构 ...

  8. 关于Java开发一职的经验

    本人为大四软件工程学生,由于准备不充分也没有前人指点,去年10月份才赶上秋招节奏,然后签下了一家比较起来还行的公司.所以不太期望大家有求职意愿但苦于不知作何准备,所以特列以下知识点检索供大家查阅.如果 ...

  9. 小程序swiper组件高度自适应【转载】

    最近在做小程序开发,复制官方文档上的swiper组件实测后发现,图片不能自适应.网上找了几个版本测试都发现存在一些小问题,目前这个版本本人实测是最好用的.记录一下,方便日后使用. 感谢原创大神的帮助, ...

  10. js中文汉字按拼音排序

    JavaScript 提供本地化文字排序,比如对中文按照拼音排序,不需要程序显示比较字符串拼音. String.prototype.localeCompare 在不考虑多音字的前提下,基本可以完美实现 ...