主要综合借鉴了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. 转载——Android permission 访问权限大全

    程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下: Android.permission.ACCESS_CHECKIN_PROPERTIES ...

  2. css position弹性盒子测试

    总结: 1.利用样式height:100%设置div高度为全屏时候必须设置所有的父元素,但是父元素那么多,不可控,所以此法不可行: 2.设置父框架的padding为100px,div进行float,p ...

  3. UVA1635 Irrelevant Elements —— 唯一分解定理 + 二项式定理

    题目链接:https://vjudge.net/problem/UVA-1635 (紫书320) 题解: 1.根据二项式定理, 可得递推公式: C(n,k) = (n-k+1)/k * C(n, k- ...

  4. CSU - 1803 —— 数学题

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1803 Description  给出正整数 n 和 m,统计满足以下条件的正整数对 ...

  5. Appium基础——one demo

    启动模拟器,启动appium   android avd启动模拟器管理 选择一个版本启动   安装appium-client 直接pip install appium-python-client安装 ...

  6. 学习c编程的第二天

    函数又叫方法,是实现某项功能或完成某项任务的代码块 #include<stdio.h>void show(){ printf("I like c language"); ...

  7. macbook清理磁盘空间

    前言:作为一名程序员,使用MacBook时间久了之后难免都会遇到“磁盘空间不足”的警告,这时就可以清理如下文件夹,一般就可以清理出几十个G的大小! 1.删除“~/资源库/Developer/Xcode ...

  8. spring 从jsp到jsp

    小例子 1.jar信息 2.web.xml文件配置 <?xml version="1.0" encoding="UTF-8"?> <web-a ...

  9. Android Studio 使用Gradle多渠道打包

    第一步:配置AndroidManifest.xml 以友盟渠道为例,渠道信息一般都是写在 AndroidManifest.xml文件中,大约如下: <meta-data android:name ...

  10. HDU1525 Euclid's Game

    Two players, Stan and Ollie, play, starting with two natural numbers. Stan, the first player, subtra ...