主要综合借鉴了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. HDU3605 Escape —— 二分图多重匹配

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others)    ...

  2. TCP/IP,HTTP,Socket初识

    在大学时候学过网络通信这一块,奈何已经还给老师,苍天饶过谁,该拾起来看看学学的还是要学,先简单了解了下这方面的知识,后续会继续通过看书来充实这方面的知识. 手机能够联网是手机底层实现了TCP/IP协议 ...

  3. ping请求超时的解决方法

    我们有时需要进行远程或者共享对方数据库的时候,会ping一下对方电脑,时候能够ping通,时候能够进行数据的传输.有时会出现ping请求超时,那么遇到这个问题该怎么解决? 我们首要解决的是看他自己是否 ...

  4. 对xml文件的sax解析(增删改查)之一

    crud(增删改查): c:creat r:retrieve u:update d:delete 以下笔记来自于韩顺平老师的讲解. 现在是用java来操作. 第一步:新建java工程.file-new ...

  5. HihoCoder 1570 : 小Hi与法阵(简单几何)

    描述 小Hi喜欢大,而小Ho喜欢小.他们所在的城市(视为二维平面)有N座法阵.现在他们各选三座法阵,以三座法阵为顶点组成三角形,并站在所选三角形的重心位置:二人选择的法阵可以有相同的.小Hi选择面积最 ...

  6. No result defined for action cn.crm.action.LinkManAction and result input

    这是struts2的一个拦截器报的错误,当你的form中的数据有问题,比如说<input type="text" name="receiverLoginID&quo ...

  7. C++之const类成员变量,const成员函数

    const修饰类的成员函数 const修饰变量一般有两种方式:const T *a,或者 T const *a,这两者都是一样的,主要看const位于*的左边还是右边,这里不再赘述,主要来看一下当co ...

  8. JUC包中的锁框架

    JUC包中的锁,包括:Lock接口,ReadWriteLock接口,LockSupport阻塞原语,Condition条件,AbstractOwnableSynchronizer/AbstractQu ...

  9. ASoC框架

    ASoC框架分为3部分: 1. platform(用来描述芯片的DAI接口,负责数据传输): DAI:snd_soc_dai_driver, 用来表示支持哪些格式数据, 提供设置格式的函数, 启动数据 ...

  10. PHP 单引号与双引号的区别 SQL中的使用

    php单引号与双引号用法:引号嵌套方法 1.双引号内不能直接就再嵌套双引号 2.双引号与单引号互相嵌套使用 如: 双引号内直接嵌套单引号 echo "<script language= ...