洛谷P3369 普通平衡树
刚学平衡树,分别用了Splay和fhq-treap交了一遍。
这是Splay的板子,貌似比较短?
Splay
``` cpp
#include
#include
#include
#include
using namespace std;
const int N = 100005, INF = 2e9;
int n;
int nid, root;
int fa[N], ch[N][2];
int val[N];
int sz[N], rep[N];
void update(int x) {
sz[x] = sz[ch[x][0]]+sz[ch[x][1]]+rep[x];
}
void rotate(int x) {
int y = fa[x], z = fa[y];
int d = ch[fa[x]][1]x;
ch[z][ch[fa[y]][1]y] = x; fa[x] = z;
ch[y][d] = ch[x][d^1]; fa[ch[x][d^1]] = y;
ch[x][d^1] = y; fa[y] = x;
update(y); update(x);
}
void splay(int x, int goal) {
for(; fa[x] != goal; rotate(x)) if(fa[fa[x]] != goal)
(ch[fa[x]][0]x)^(ch[fa[fa[x]]][0]fa[x]) ? rotate(x) : rotate(fa[x]);
if(!goal) root = x;
}
void find(int v) {
int u = root;
if(!u) return ;
while(ch[u][val[u]<v] && val[u] != v) u = ch[u][val[u]<v];
splay(u, 0);
}
int findPre(int v) {
find(v);
int u = root;
if(val[u] < v) return u;
u = ch[u][0];
while(ch[u][1]) u = ch[u][1];
return u;
}
int findNxt(int v) {
find(v);
int u = root;
if(val[u] > v) return u;
u = ch[u][1];
while(ch[u][0]) u = ch[u][0];
return u;
}
void insert(int v) {
int u = root, f = 0;
while(u && val[u] != v) f = u, u = ch[u][val[u]<v];
if(u) rep[u]++;
else {
nid++;
fa[nid] = f;
ch[f][val[f]<v] = nid;
val[nid] = v;
sz[nid] = rep[nid] = 1;
u = nid;
}
splay(u, 0);
}
void del(int v) {
int pre = findPre(v), nxt = findNxt(v);
splay(pre, 0); splay(nxt, pre);
int tar = ch[nxt][0];
if(rep[tar] > 1) {
rep[tar]--;
splay(tar, 0);
}
else ch[nxt][0] = 0;
}
int kth(int x) {
if(sz[root] < x) return 0;
int u = root;
while(1) {
int lson = ch[u][0];
if(x <= sz[lson]) u = lson;
else if(x > sz[lson]+rep[u]) x -= sz[lson]+rep[u], u = ch[u][1];
else return val[u];
}
}
int main() {
insert(-(1<<31)+2); //添加两个哨兵节点,防止越界
insert((1<<31)-2);
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n;
for(int i = 1, c, x; i <= n; i++) {
cin >> c >> x;
if(c == 1) insert(x);
else if(c == 2) del(x);
else if(c == 3) find(x), cout << sz[ch[root][0]] << endl;
else if(c == 4) cout << kth(x+1) << endl;
else if(c == 5) cout << val[findPre(x)] << endl;
else if(c == 6) cout << val[findNxt(x)] << endl;
}
return 0;
}
这是fhq-treap的板子(为了美观,我已经不能再无脑压行了)
<h3>fhq-treap</h3>
``` cpp
#include <iostream>
#include <cstring>
#include <algorithm>
#include <ctime>
using namespace std;
const int N = 100005;
int n;
int ch[N][2], val[N], sz[N], rnd[N];
int nid, root;
void update(int x) {
sz[x] = sz[ch[x][0]]+sz[ch[x][1]]+1;
}
int merge(int x, int y) {
if(!x || !y) return x+y;
if(rnd[x] < rnd[y]) {
ch[x][1] = merge(ch[x][1], y);
update(x);
return x;
} else {
ch[y][0] = merge(x, ch[y][0]);
update(y);
return y;
}
}
void split(int cur, int k, int &x, int &y) {
if(!cur) x = y = 0;
else {
if(val[cur] <= k) x = cur, split(ch[cur][1], k, ch[cur][1], y);
else y = cur, split(ch[cur][0], k, x, ch[cur][0]);
update(cur);
}
}
int newNode(int v) {
val[++nid] = v;
sz[nid] = 1;
rnd[nid] = rand();
return nid;
}
void insert(int v) {
int x, y;
split(root, v, x, y);
root = merge(merge(x, newNode(v)), y);
}
void del(int v) {
int x, y, z;
split(root, v, x, z); split(x, v-1, x, y);
y = merge(ch[y][0], ch[y][1]);
root = merge(merge(x, y), z);
}
int rankOf(int v) {
int x, y, ret;
split(root, v-1, x, y);
ret = sz[x]+1;
root = merge(x, y);
return ret;
}
int kth(int src, int x) {
if(sz[src] < x) return 0;
int u = src;
while (1) {
if(x <= sz[ch[u][0]]) u = ch[u][0];
else if(sz[ch[u][0]]+1 == x) return u;
else if(sz[ch[u][0]]+1 < x) x -= sz[ch[u][0]]+1, u = ch[u][1];
}
}
int precursor(int v) { //前驱
int x, y, ret;
split(root, v-1, x, y);
ret = val[kth(x, sz[x])];
root = merge(x, y);
return ret;
}
int successor(int v) { //后继
int x, y, ret;
split(root, v, x, y);
ret = val[kth(y, 1)];
root = merge(x, y);
return ret;
}
int main() {
srand((unsigned)time(NULL));
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> n;
for(int i = 1, c, x; i <= n; i++) {
cin >> c >> x;
if(c == 1) insert(x);
else if(c == 2) del(x);
else if(c == 3) cout << rankOf(x) << endl;
else if(c == 4) cout << val[kth(root, x)] << endl;
else if(c == 5) cout << precursor(x) << endl;
else if(c == 6) cout << successor(x) << endl;
}
return 0;
}
洛谷P3369 普通平衡树的更多相关文章
- 洛谷P3369普通平衡树(Treap)
题目传送门 转载自https://www.cnblogs.com/fengzhiyuan/articles/7994428.html,转载请注明出处 Treap 简介 Treap 是一种二叉查找树.它 ...
- [洛谷P3369] 普通平衡树 Treap & Splay
这个就是存一下板子...... 题目传送门 Treap的实现应该是比较正经的. 插入删除前驱后继排名什么的都是平衡树的基本操作. #include<cstdio> #include< ...
- 洛谷P3369 【模板】普通平衡树(Treap/SBT)
洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...
- 【洛谷P3369】【模板】普通平衡树题解
[洛谷P3369][模板]普通平衡树题解 题目链接 题意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3 ...
- [洛谷P3391] 文艺平衡树 (Splay模板)
初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...
- 绝对是全网最好的Splay 入门详解——洛谷P3369&BZOJ3224: Tyvj 1728 普通平衡树 包教包会
平衡树是什么东西想必我就不用说太多了吧. 百度百科: 一个月之前的某天晚上,yuli巨佬为我们初步讲解了Splay,当时接触到了平衡树里的旋转等各种骚操作,感觉非常厉害.而第二天我调Splay的模板竟 ...
- BZOJ3223/洛谷P3391 - 文艺平衡树
BZOJ链接 洛谷链接 题意 模板题啦~2 代码 //文艺平衡树 #include <cstdio> #include <algorithm> using namespace ...
- BZOJ3224/洛谷P3391 - 普通平衡树(Splay)
BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...
- 洛谷 P3391 文艺平衡树
题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 --b ...
随机推荐
- hadoop1.0 和 Hadoop 2.0 的区别
1.Hadoop概述 在Google三篇大数据论文发表之后,Cloudera公司在这几篇论文的基础上,开发出了现在的Hadoop.但Hadoop开发出来也并非一帆风顺的,Hadoop1.0版本有诸多局 ...
- 导入JavaWeb 项目出现的问题
前言: 环境: windown 10 JDK 1.8 Tomcat 7 eclipse 导入项目 下面错误是出现的问题 Multiple annotations found at this line: ...
- 【原】无脑操作:eclipse创建maven工程时,如何修改默认JDK版本?
问题描述:eclipse建立maven项目时,JDK版本默认是1.5,想创建时默认版本设置为1.8,如何修改? 解决方案: 找到本机maven仓库存放位置,比如:${user.home}/.m2/路径 ...
- 在Windows 10中截取截图的6种方式 简介
在Windows 10中截取截图的6种方式 简介 截图对于不同的目的很重要.它可以用于捕获笔记本电脑上的任何内容的截图.所以,如果你使用Windows 10,你可能不知道如何截图,因为它是比较新的.因 ...
- Spring Boot 2.x 快速入门(上)HelloWorld示例
本文重点 最近决定重新实践下Spring Boot的知识体系,因为在项目中遇到的总是根据业务需求走的知识点,并不能覆盖Spring Boot完整的知识体系,甚至没有一个完整的实践去实践某个知识点.最好 ...
- CF786B Legacy(线段树优化建图)
嘟嘟嘟 省选Day1T2不仅考了字符串,还考了线段树优化建图.当时不会,现在赶快学一下. 线段树能优化的图就是像这道题一样,一个点像一个区间的点连边,或一个区间像一个点连边.一个个连就是\(O(n ^ ...
- C#多线程与并行编程方面的电子书,中英文版本
给大家共享一些C#多线程与并行编程方面的电子书,中英文版本的. 链接: 百度网盘地址 提取码: y99a
- AI 强化学习
强化学习(reinforcement learning,简称RL), agent policy state action 目标 最大化累计reward 参考链接: https://en.wikipe ...
- 0.[Andriod]之从零安装配置Android Studio并编写第一个Android App
0. 所需的安装文件 笔者做了几年WP,近来对Android有点兴趣,尝试一下Android开发,废话不多说,直接进入主题,先安装开发环境,笔者的系统环境为windows8.1&x64. 安装 ...
- C#帮助类:将List转换成Datatable
public class ListToDatatable { public static DataTable ToDataTable <T> (List <T> items) ...