主要综合借鉴了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. kafka的基本操作

    启动ZooKeeper 打开一个新终端并键入以下命令 - bin/zookeeper-server-start.sh config/zookeeper.properties 要启动Kafka Brok ...

  2. 第一个自定义开发的Arcgis地图

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  3. Codeforces Round #385 (Div. 2) Hongcow Builds A Nation —— 图论计数

    题目链接:http://codeforces.com/contest/745/problem/C C. Hongcow Builds A Nation time limit per test 2 se ...

  4. Ubuntu安装基础教程

    作者:TeliuTe 来源:基础教程网 二十三.安装Ubuntu14.04 返回目录 下一课 14.04 版安装与前面版本类似,学习中遇到不清楚的地方,可以参考一下前面的内容,操作中注意细心,下面来看 ...

  5. 客户端调用cxf发布的服务

    import java.util.ArrayList; import java.util.List; import javax.xml.namespace.QName; import org.apac ...

  6. BLOB二进制大数据

    What is a Blob? A blob object represents a chuck of bytes that holds data of a file. But a blob is n ...

  7. EDM文件编写规范及注意事项

    [设计EDM邮件] (1)乱码:你没法知道所有用户的系统环境,因此使用utf8来避免乱码是非常重要的 (2)绝对URL:若是相对URL,用户在打开页面是将看不到图片 (3)图片Alt属性:大多数邮件服 ...

  8. coeforces 665D D. Simple Subset(最大团orsb题)

    题目链接: D. Simple Subset time limit per test 1 second memory limit per test 256 megabytes input standa ...

  9. POJ3061 Subsequence

    Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16520   Accepted: 7008 Desc ...

  10. 二、mysql安装详解

    step1:打开下载的mysql安装文件(mysql-5.5.36-win32.msi),双击运行,如下图: step2:点击“Next”按钮继续,如下图: step3:点击“勾选”,点击“Next” ...