splay模板(BZOJ3224)
用splay实现二叉搜索树的模板,支持插入,删除,找前缀后缀,x的排名以及第x名的数。
#include <cstdio>
#define l(x) t[x].s[0]
#define r(x) t[x].s[1]
#define f(x) t[x].p
#define lc(x) (r(f(x)) == x)
#define st(a,b,c) t[a].s[c] = b; f(b) = a const int N = ;
int m,x,op,tt,rt;
struct nd {int v,p,sz,s[];}t[N]; void pu(int x) {t[x].sz = t[l(x)].sz+t[r(x)].sz+;}
void rot(int x) {
int y = f(x), z = f(y), lx = lc(x), ly = lc(y);
st(y,t[x].s[!lx],lx); st(z,x,ly); st(x,y,!lx); pu(y);
}
void sp(int x) {
for(int y; y = f(x); rot(x)) if(f(y)) {
if(lc(x)^lc(y)) rot(x); else rot(y);
}
pu(x), rt = x;
}
void in(int x) {
int c = rt;
while(t[c].s[t[c].v<x]) t[c].sz++, c = t[c].s[t[c].v<x];
if(c) t[c].sz++; t[c].s[t[c].v<x] = ++tt, f(tt) = c, t[tt].v = x, t[tt].sz = , sp(tt);
}
void del(int x) {
int c = rt;
while() {
if(t[c].v == x) {x = c; break;}
if(t[c].v < x) c = r(c); else c = l(c);
}
sp(x);
if(!l(x)) f(r(x)) = , rt = r(x);
else if(!r(x)) f(l(x)) = , rt = l(x);
else {
f(l(x)) = , c = l(x);
while(r(c)) c = r(c);
sp(c), r(c) = r(x), f(r(x)) = c;
}
}
int pre(int x) {
int c = rt, ans = 0xcfcfcfcf;
while(c) if(t[c].v < x) ans = t[c].v, c = r(c); else c = l(c);
return ans;
}
int nxt(int x) {
int c = rt, ans = 0x3f3f3f3f;
while(c) if(t[c].v > x) ans = t[c].v, c = l(c); else c = r(c);
return ans;
}
int rk(int x) {
int c = rt, k = , ans = ;
while(c) if(t[c].v < x) ans = k+t[l(c)].sz+, k += t[l(c)].sz+, c = r(c); else c = l(c);
return ans+;
}
int sa(int x, int k) {
if(t[l(x)].sz == k-) return t[x].v;
if(t[l(x)].sz >= k) return sa(l(x), k);
return sa(r(x), k-t[l(x)].sz-);
} int main() {
scanf("%d", &m);
while(m--) {
scanf("%d%d", &op, &x);
if(op == ) in(x);
else if(op == ) del(x);
else if(op == ) printf("%d\n", rk(x));
else if(op == ) printf("%d\n", sa(rt,x));
else if(op == ) printf("%d\n", pre(x));
else printf("%d\n", nxt(x));
}
return ;
}
splay模板(BZOJ3224)的更多相关文章
- [luogu3369/bzoj3224]普通平衡树(splay模板、平衡树初探)
解题关键:splay模板题整理. 如何不加入极大极小值?(待思考) #include<cstdio> #include<cstring> #include<algorit ...
- bzoj 1588 splay模板题
用晚自习学了一下splay模板,没想象中那么难,主要是左旋和右旋可以简化到一个函数里边,减少代码长度... #include<iostream> #include<cstdio> ...
- COJ 1002 WZJ的数据结构(二)(splay模板)
我的LCC,LCT,Splay格式终于统一起来了... 另外..这个形式的Splay是标准的Splay(怎么鉴别呢?看Splay函数是否只传了一个变量node就行),刘汝佳小白书的Splay写的真是不 ...
- Splay 模板
Splay 模板 struct SplayTree{ const static int maxn = 1e5 + 15; int ch[maxn][2] , key[maxn] , s[maxn] , ...
- BZOJ1588 [HNOI2002]营业额统计 splay模板
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 16189 Solved: 6482 [Submit][S ...
- 文艺平衡树(splay模板)
题干:splay模板,要求维护区间反转. splay是一种码量小于treap,但支持排名,前驱后继等treap可求的东西,也支持区间反转的平衡树. 但是有两个坏处: 1.splay常数远远大于trea ...
- [洛谷P3391] 文艺平衡树 (Splay模板)
初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...
- bzoj3224 普通平衡树 splay模板
题目传送门 题目大意:完成一颗splay树. 思路:模板题,学着还是很有意思的. 学习splay树:蒟蒻yyb 该题模板:汪立超 #include<bits/stdc++.h> #defi ...
- [bzoj3224]Tyvj 1728 普通平衡树——splay模板
题目 你需要写一种数据结构支援以下操作. 插入元素. 删除元素. 查询元素的排名. 查询第k小的元素. 查询元素前趋. 查询元素后继. 题解 BBST裸题. 代码 #include <cstdi ...
随机推荐
- webView调用系统地图,电话,和跳转链接的方法
webView.dataDetectorTypes = UIDataDetectorTypePhoneNumber | UIDataDetectorTypeLink | UIDataDetectorT ...
- bzoj千题计划220:bzoj3938: Robot
http://www.lydsy.com/JudgeOnline/problem.php?id=3938 以时间为x轴,以距离为y轴,那么每个机器人的行走路径就是一条折线 把折线分段加入线段树里,然后 ...
- REST or RPC?
1 概念 1.1 RPC RPC(Remote Procedure Call)-远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存 ...
- 使用 dynamic 类型让 ASP.NET Core 实现 HATEOAS 结构的 RESTtful API
上一篇写的是使用静态基类方法的实现步骤: http://www.cnblogs.com/cgzl/p/8726805.html 使用dynamic (ExpandoObject)的好处就是可以动态组 ...
- Python-进程与线程理论基础-Day10
进程与线程理论基础 1.背景知识 理论基础: 一 操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2:管理.调度进程,并且将多个进程对硬件的竞争变得有序 二 多道技术: 1.产生背景 ...
- 阿里云API网关(13)请求身份识别:客户端请求签名和服务网关请求签名
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- Django多级评论
一.原理 #多级评论原理简单原理,弄完之后发现基础白学了 msg_list = [ {'id':1,'content':'xxx','parent_id':None}, {'id':2,'conten ...
- 安卓手机USB共享网络给PC上网
开端 哈哈,最近我又发现了一个校园网的漏洞,但是只能手机连接,于是就想手机连接之后通过usb共享给电脑上网. 在手机上连接校园网WiFi,开启USB网络共享并且连接电脑之后,却发现电脑十分的卡顿!CP ...
- UVA-562 Dividing coins---01背包+平分钱币
题目链接: https://vjudge.net/problem/UVA-562 题目大意: 给定n个硬币,要求将这些硬币平分以使两个人获得的钱尽量多,求两个人分到的钱最小差值 思路: 它所给出的n个 ...
- 【原创】公司各个阶段 CTO 需要做什么?(下篇)
假设一个公司发展有以下几个阶段: 0 :创始阶段: 0.5 :有产品但无管理阶段: 1 :经过 1年的发展初步稳定的阶段: 1+ :稳步发展阶段. 上一篇文章中,我们聊了公司在初创阶段,CTO 需要做 ...