无旋treap板子!
#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板子!的更多相关文章
- [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...
- [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和treap一样简单易懂,同时还支持可持久化. 无旋treap的节点定义和treap一样,都要同时满足树性质和堆性质,我 ...
- [转载]无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )
转自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182631.html 1500: [NOI2005]维修数列 Time Limit: 10 Sec Mem ...
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- 【算法学习】Fhq-Treap(无旋Treap)
Treap——大名鼎鼎的随机二叉查找树,以优异的性能和简单的实现在OIer们中广泛流传. 这篇blog介绍一种不需要旋转操作来维护的Treap,即无旋Treap,也称Fhq-Treap. 它的巧妙之处 ...
- 无旋treap的区间操作实现
最近真的不爽...一道维修数列就做了我1上午+下午1h+1晚上+晚上1h+上午2h... 一道不错的自虐题... 由于这一片主要讲思想,代码我放这里了 不会无旋treap的童鞋可以进这里 呵呵... ...
- 无旋treap的简单思想以及模板
因为学了treap,不想弃坑去学splay,终于理解了无旋treap... 好像普通treap没卵用...(再次大雾) 简单说一下思想免得以后忘记.普通treap因为带旋转操作似乎没卵用,而无旋tre ...
- [BZOJ3223]文艺平衡树 无旋Treap
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...
- [您有新的未分配科技点] 无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MB Description Input 输入的第1 行包含两个数N 和M(M ≤20 ...
随机推荐
- Dsu on Tree
这个属于一种技巧,可以解决类似于子树询问无修改可离线的问题,一些点分治的问题也可以用Dsu on Tree解决,并且常数较小,代码复杂度低,很具有可写性. 整体上的意思就是继承重儿子的信息,暴力修改轻 ...
- [Python]-pip-ReadTimeoutError: Read timed out 问题
问题描述 就是在安装Python包的时候,由于时间太长引起的超时问题 问题解决 第一个办法是更改源地址:在 ~/.pip/ 下创建文件 pip.conf(如果还没有的话), 模版如下: [global ...
- ILSVRC2016目标检测任务回顾——视频目标检测(VID)
转自知乎<深度学习大讲堂> 雷锋网(公众号:雷锋网)按:本文作者王斌,中科院计算所前瞻研究实验室跨媒体计算组博士生,导师张勇东研究员.2016年在唐胜副研究员的带领下,作为计算所MCG-I ...
- Linux常用rmp包网址
* HA:http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/ * Openstack:https://r ...
- 设计模式 笔记 状态模式 State
//---------------------------15/04/28---------------------------- //State 状态模式----对象行为型模式 /* 1:意图: ...
- java批量爬取电影资源
摘要 网上有很多个人站来分享电影资源,其实有时候我们自己也想做这个一个电影站来分享资源.但是这个时候就有一个问题,电影的资源应该从哪里来呢?难道要自己一条条手动去从网络上获取,这样无疑是缓慢而又效率低 ...
- (功能篇)回顾Bug管理系统Mantis优化改造经历
共分为两篇,功能篇和技术篇. 时间大约是2016年冬天. 考虑搭一个用于Bug管理和追踪的系统. 综合比较下,选择了小巧的开源工具,Mantis. 在源码基础上,做代码修改,完成了定制版的优化改造. ...
- 手机Gmail上用Exchange协议配置收发QQ邮箱
1.开启Exchange服务 2.生成授权码(登录密码) 3."服务器"填入ex.qq.com
- 177. Convert Sorted Array to Binary Search Tree With Minimal Height【LintCode by java】
Description Given a sorted (increasing order) array, Convert it to create a binary tree with minimal ...
- M1事后分析报告--We have power to change the origin state
M1事后分析报告 设计与实现 我们发的软件解决的问题?是否满足后面小组的要求?是否能够完全拟合前期目标? 答: 前期我们的软件完成量并不是特别让人满意,我们组在完成这些任务量之后,发现有很多地方是在做 ...