主要综合借鉴了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代码的更多相关文章

  1. [bzoj3224]普通平衡树/3223文艺平衡树

    这是一道很普通的题.. 最近花了很多时间来想要去干什么,感觉自己还是太拿衣服 做这道题是因为偶尔看到了lavender的blog和她的bzoj早期AC记录,就被题目深深地吸引到了,原因有二: 自己sp ...

  2. 【Splay】bzoj3223-Tyvj1729文艺平衡树

    一.题目 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 ...

  3. bzoj3223 文艺平衡树 (treap or splay分裂+合并)

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3313  Solved: 1883 [Submit][S ...

  4. bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2202  Solved: 1226[Submit][Sta ...

  5. bzoj 3223: Tyvj 1729 文艺平衡树 (splay)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3223 题面: 3223: Tyvj 1729 文艺平衡树 Time Limit: 10 S ...

  6. 洛谷 P3391 【模板】文艺平衡树(Splay)

    题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...

  7. BZOJ3223 文艺平衡树(splay)

    题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...

  8. 洛谷 P3391【模板】文艺平衡树(Splay)

    题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...

  9. BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6881  Solved: 4213[Submit][Sta ...

随机推荐

  1. Python 的枚举类型

    起步 Python 中的枚举类型 Python 的原生类型中并不包含枚举类型.为了提供更好的解决方案,Python 通过 PEP 435 在 3.4 版本中添加了 enum 标准库. 枚举类型可以看作 ...

  2. 双端队列篇deque SDUT OJ 双向队列

    双向队列 Time Limit: 1000MS Memory limit: 65536K 题目描述 想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首:两头都可以做出队,入队的操 ...

  3. hdu1198 Farm Irrigation —— dfs or 并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1198 dfs: #include<cstdio>//hdu1198 dfs #includ ...

  4. linuxshell,闲散命令记录

    1. 移动光标到 0:0 位置 printf "\033[0;0H" 2. 清屏 printf "\033[2J" 3. awk接收 外部变量 awk -v v ...

  5. tomcat正常启动,但是java项目没有启动原因

    右键项目,选择properties,查看该属性配置的是否正确

  6. Python: PS滤镜--径向模糊

    本文用 Python 实现 PS 滤镜中的径向模糊特效,具体的算法原理和效果可以参考之前的博客: http://blog.csdn.net/matrix_space/article/details/3 ...

  7. 转,如果linux不能用yum安装asterisk时,可以库参照以下办法添加asterisk仓库

    LinuxCentOSRedHat Installing a binary distribution of Asterisk makes it easier to maintain your syst ...

  8. Rsyslog 日志相关内容

    [root@server vusers_home]# rpm -ql rsyslog|more       ###.so结尾为模块,模块有分im为输入模块,om 为输出模块/etc/logrotate ...

  9. ubuntu16.04 ROS安转及RVIZ启动

    1.软件中心配置 首先打开软件和更新对话框,打开后按照下图进行配置(确保你的"restricted", "universe," 和 "multiver ...

  10. JavaScript-Tool-导向:wizard-un

    ylbtech-JavaScript-Tooll-导向:wizard 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtec ...