无旋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 ...
随机推荐
- HUE配置HIVE
HIVE配置 修改hue.ini配置文件 [beeswax] hive_server_host=node1 hive_server_port= hive_conf_dir=/usr/hive-/con ...
- .net 设置Webbowser 版本
.net 里的Webbowser控件默认情况是用IE7来渲染 可修改注册表试用是最新的版本来渲染: using System; using System.Collections.Generic; us ...
- 20155206 Exp5 MSF基础应用
20155206 Exp5 MSF基础应用 基础问题 . 用自己的话解释什么是exploit,payload,encode . exploit:这个词本身只是利用,但是它在黑客眼里就是漏洞利用.有漏洞 ...
- 20155220 Exp9 Web安全基础实践
Exp9 Web安全基础实践 实验过程 开启webgoat 输入java -jar webgoat-container-7.1-exec.jar,来运行webgoat 在浏览器输入localhost: ...
- source insight之quicker.em宏的使用
source insight有很多宏可以用,这里介绍的宏是quicker.em这个宏,它是华为的一个员工写的,很实用. 1.安装quicker.em宏 一.打开base这个工程Project-> ...
- Linux日记Day3---Linux的文件属性与目录配置
Linux最优秀的地方之一,就在于它的多用户.多任务环境.为了让用户具有较安全的管理机制,文件的权限管理是很重要的.Linux通常将文件的访问方式分为分为三个类别,分别是owner/group/oth ...
- BERT总结:最先进的NLP预训练技术
BERT(Bidirectional Encoder Representations from Transformers)是谷歌AI研究人员最近发表的一篇论文:BERT: Pre-training o ...
- PAT-1010 Radix
1010 Radix (25 分) Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 1 ...
- 加速github、kaggle访问、加速python packge下载更改源
OS: WIN10 加速github.kaggle访问 使用站长DNS工具(http://tool.chinaz.com/dns) 查询响应速度最快的网站服务器IP,将网站服务器IP和域名添加到电脑h ...
- git 和 github 链接
第一步 再电脑上安装git 请自行搜索 到你需要的一个目录下:例如/gittest 首先创建文件,然后 git add 和 git commit 不然直接查看 git branch - ...