普通平衡树与文艺平衡树的splay代码
主要综合借鉴了yyb和马前卒两位大佬的。
//普通平衡树
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define R(x) scanf("%d", &x)
#define ri readint()
#define gc getchar()
#define wi(x) printf("%d\n", x)
#define ls(x) T[x].ch[0]
#define rs(x) T[x].ch[1]
using namespace std; int readint() {
int x = , s = , c = gc;
while (c <= ) c = gc;
if (c == '-') s = -, c = gc;
for (; isdigit(c); c = gc)
x = x * + c - ;
return x * s;
} struct node {
int fa;
int ch[];
int val, cnt;
int size;
};
node T[];
int tot, root; int lr(int x) {
return x == rs(T[x].fa);
} void Connect(int son, int fa, int way) {
T[fa].ch[way] = son;
T[son].fa = fa;
} void push_up(int pos) {
T[pos].size = T[ls(pos)].size + T[rs(pos)].size + T[pos].cnt;
} void Rotate(int x) {
int f = T[x].fa, gf = T[f].fa;
int x_f = lr(x), f_gf = lr(f);
Connect(T[x].ch[x_f^], f, x_f);
Connect(f, x, x_f^);
Connect(x, gf, f_gf);
push_up(f);
push_up(x);
} void splay(int pos, int goal) {
for (; T[pos].fa != goal; Rotate(pos)) {
int f = T[pos].fa, gf = T[f].fa;
if (gf != goal) {
lr(f) ^ lr(pos) ? Rotate(pos) : Rotate(f);
}
}
if (goal == ) root = pos;
} void Insert(int x) {
int pos = root, fa = ;
while (pos && T[pos].val != x) {
fa = pos;
pos = T[pos].ch[x > T[pos].val];
}
if (pos) {
T[pos].cnt++;
} else {
pos = ++tot;
if (fa) T[fa].ch[x > T[fa].val] = pos;
T[pos].ch[] = T[pos].ch[] = ;
T[pos].fa = fa;
T[pos].val = x;
T[pos].cnt = T[pos].size = ;
}
splay(pos, );
} int find(int x) {//数字val为x的位置
int pos = root;
if (!pos) return ;
while (T[pos].ch[x > T[pos].val] && x != T[pos].val)
pos = T[pos].ch[x > T[pos].val];
splay(pos, );
return pos;
} int Next(int flag, int x) {//0为前驱,1为后继
find(x);
int pos = root;
if (T[pos].val > x && flag) return pos;
if (T[pos].val < x && !flag) return pos;
pos = T[pos].ch[flag];
while (T[pos].ch[flag^]) {
pos = T[pos].ch[flag^];
}
return pos;
} void Delet(int x) {//删除数字x
int pos = find(x);
if (!pos) return;
if (T[pos].cnt > ) {
T[pos].cnt--;
T[pos].size--;
return;
} else {
if (!ls(pos) && !rs(pos)) {
root = ;
return;
} else if (ls(pos) && rs(pos)) {
int u = ls(pos);
while (rs(u)) u = rs(u);
splay(u, );
Connect(rs(pos), u, );
push_up(u);
} else {
if (ls(pos)) root = ls(pos);
else root = rs(pos);
T[root].fa = ;
}
}
} int Rank(int x) {//数字x的排名
find(x);
return T[ls(root)].size + ;
} int Kth(int x) {//第x大的数
int pos = root;
if (T[pos].size < x) return -;
while (true) {
int lson = ls(pos);
if (x > T[lson].size + T[pos].cnt) {
x -= T[lson].size + T[pos].cnt;
pos = rs(pos);
} else {
if (x > T[lson].size) return T[pos].val;//这个题返回的是值
pos = lson;
}
}
} int main() {
int n;
for (n = ri; n; n--) {
int op = ri, x = ri;
if (op == ) Insert(x);
else if (op == ) Delet(x);
else if (op == ) wi(Rank(x));
else if (op == ) wi(Kth(x));
else wi(T[Next(op - , x)].val);
}
return ;
}
//文艺平衡树
#include <cstdio>
#include <cctype>
#include <iostream>
#include <algorithm>
#define ri readint()
#define gc getchar()
#define init(a, b) memset(a, b, sizeof(a))
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define irep(i, a, b) for (int i = a; i >= b; i--)
#define ls(x) T[x].ch[0]
#define rs(x) T[x].ch[1]
using namespace std; typedef double db;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
const int inf = 0x3f3f3f3f;
const ll INF = 1e18; inline int readint() {
int x = , s = , c = gc;
while (!isdigit(c)) c = gc;
if (c == '-') s = -, c = gc;
for (; isdigit(c); c = gc)
x = x * + c - ;
return x * s;
} const int maxn = 1e5 + ;
int n, m, root, tot;
struct node {
int fa, ch[];
int val, size, tag;
};
node T[maxn]; int lr(int x) {
return x == T[T[x].fa].ch[];
} void connect(int son, int fa, int way) {
T[son].fa = fa;
T[fa].ch[way] = son;
} void push_down(int pos) {
if (T[pos].tag) {
T[ls(pos)].tag ^= ;
T[rs(pos)].tag ^= ;
T[pos].tag = ;
swap(ls(pos), rs(pos));
}
} void push_up(int pos) {
T[pos].size = T[ls(pos)].size + T[rs(pos)].size + ;
} void rotate(int pos) {
int f = T[pos].fa, gf = T[f].fa;
int x_f = lr(pos), f_gf = lr(f);
connect(T[pos].ch[x_f^], f, x_f);
connect(f, pos, x_f^);
connect(pos, gf, f_gf);
push_up(f);
push_up(pos);
} void splay(int pos, int goal) {
for (; T[pos].fa != goal; rotate(pos)) {
int f = T[pos].fa, gf = T[f].fa;
if (gf != goal)
lr(pos) ^ lr(f) ? rotate(pos) : rotate(f);
}
if (!goal) root = pos;
} void insert(int x) {
int pos = root, fa = ;
while (pos && T[pos].val != x) {
fa = pos;
pos = T[pos].ch[x > T[pos].val];
}
pos = ++tot;
if (fa) T[fa].ch[x > T[fa].val] = pos;
T[pos].fa = fa;
T[pos].ch[] = T[pos].ch[] = ;
T[pos].val = x;
T[pos].size = ;
T[pos].tag = ;
splay(pos, );
} int Kth(int x) {
int pos = root;
while (true) {
push_down(pos);
int lson = ls(pos);
if (x > T[lson].size + ) {
x -= T[lson].size + ;
pos = rs(pos);
} else {
if (x > T[lson].size) return pos;
pos = lson;
}
}
} void work(int l, int r) {
l = Kth(l), r = Kth(r + );
splay(l, ), splay(r, l);
int pos = rs(root);
pos = ls(pos);
T[pos].tag ^= ;
} void dfs(int cur) {
push_down(cur);
if (T[cur].ch[]) dfs(T[cur].ch[]);
if (T[cur].val != -inf && T[cur].val != inf)
printf("%d ", T[cur].val);
if (T[cur].ch[]) dfs(T[cur].ch[]);
} int main() {
n = ri, m = ri;
insert(inf), insert(-inf);
rep(i, , n) insert(i);
while (m--) {
int l = ri, r = ri;
work(l, r);
}
dfs(root);
return ;
}
普通平衡树与文艺平衡树的splay代码的更多相关文章
- [bzoj3224]普通平衡树/3223文艺平衡树
这是一道很普通的题.. 最近花了很多时间来想要去干什么,感觉自己还是太拿衣服 做这道题是因为偶尔看到了lavender的blog和她的bzoj早期AC记录,就被题目深深地吸引到了,原因有二: 自己sp ...
- 【Splay】bzoj3223-Tyvj1729文艺平衡树
一.题目 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 ...
- bzoj3223 文艺平衡树 (treap or splay分裂+合并)
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3313 Solved: 1883 [Submit][S ...
- bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2202 Solved: 1226[Submit][Sta ...
- bzoj 3223: Tyvj 1729 文艺平衡树 (splay)
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3223 题面: 3223: Tyvj 1729 文艺平衡树 Time Limit: 10 S ...
- 洛谷 P3391 【模板】文艺平衡树(Splay)
题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- BZOJ3223 文艺平衡树(splay)
题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- 洛谷 P3391【模板】文艺平衡树(Splay)
题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6881 Solved: 4213[Submit][Sta ...
随机推荐
- Nginx+Tomcat搭建负载均衡集群
Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器, 使用 Nginx 可以使得程序在高并发的情况下依旧可以保持良好的性能.使用 Nginx+Tomcat ...
- 《编程之美》之如何控制CPU的暂用率固定在50%
<编程之美>第一章 让CPU暂用率听你指挥的粗糙实现,如何控制CPU的暂用率固定在50% #include <stdio.h> #include <Windows.h&g ...
- Ubuntu下安装Python3.4及用python编译py文件
1.安装python 3.4程序 sudo apt-get install python3.4 2.python 3.4是被默认安装在/usr/local/lib/python3.4,删除默认pyth ...
- HDU1873 看病要排队 —— 优先队列(STL)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1873 题解: 题目已经说出了解题方法:优先队列.但是之前没有学过优先队列,而且这题还是在现场赛做的.由 ...
- UVA-12293(组合游戏)
题意: 有两个相同的盒子,一个盒子里面有n个球,另一个盒子里面有1个球,每次清空球较少的那个盒子,然后从另外的一个盒子里拿到空盒子里使得操作后两个盒子至少有一个球,判断是先手还是后者胜; 思路: 跟每 ...
- System.exit(0);和finish();,push原理
今天师姐问我安卓后台的问题,想起几年前做进制转换的时候特意研究了一下怎么才能「不驻留内存地退出」.虽然Android不推荐用户手动关闭进程,但是在那个内存捉襟见肘的年代,不得不考虑内存. 首先直接按b ...
- VOIP语音编码带宽计算
VOIP Bandwidth consumption naturally depends on the codec used. VOIP消耗的带宽一般取决于所使用的语音编码. When calcul ...
- Tomcat 安装之后,双击Tomcat.exe,无法运行成功,怎么办?
Log形式多种多样,有的时候跟下面一样: 首先的解决方案就是:修改server.xml中所有的端口,因为不只8080端口可能被占用! 我在出问题的时候就修改8080端口.结果死活运行不了,纠结一些时间 ...
- SQL Server中查询CPU占用高的SQL语句
SQL Server中查询CPU占用高的情况,会用到sys.sysprocesses ,dm_exec_sessions ,dm_exec_requests 一.查看当前的数据库用户连接有多少 USE ...
- js格式
/** * Created by admin on 2017/9/22. */ // 分号后不要再有多余的空格 var name = "North"; var name = &qu ...