Splay树求第k大模板
今天上午借着休息日得机会手撸了一下模板,终于对着模板调出来了。prev和next占用了std namespace里面的东西,然后报警我上次给关了所以。。。。。就花了3个小时吧。
inline加不加无所谓,但是代码规范一定要有。

#include <bits/stdc++.h>
using namespace std;
#define limit (1000000 + 5)//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f
#define lowbit(i) i&(-i)//一步两步
#define EPS 1e-6
#define FASTIO ios::sync_with_stdio(false);cin.tie(0);
#define ff(a) printf("%d\n",a );
#define pi(a,b) pair<a,b>
#define rep(i, a, b) for(ll i = a; i <= b ; ++i)
#define per(i, a, b) for(ll i = b ; i >= a ; --i)
#define MOD 998244353
#define traverse(u) for(int i = head[u]; ~i ; i = edge[i].next)
#define FOPEN freopen("C:\\Users\\tiany\\CLionProjects\\acm_01\\data.txt", "rt", stdin)
#define FOUT freopen("C:\\Users\\tiany\\CLionProjects\\acm_01\\dabiao.txt", "wt", stdout)
#define debug(x) cout<<x<<endl
typedef long long ll;
typedef unsigned long long ull;
inline ll read(){
ll sign = 1, x = 0;char s = getchar();
while(s > '9' || s < '0' ){if(s == '-')sign = -1;s = getchar();}
while(s >= '0' && s <= '9'){x = (x << 3) + (x << 1) + s - '0';s = getchar();}
return x * sign;
}//快读
void write(ll x){
if(x < 0) putchar('-'),x = -x;
if(x / 10) write(x / 10);
putchar(x % 10 + '0');
}
struct node{
node *son[2], *fa;//确定三个最重要的
int key,cnt,size;
node():fa(nullptr),key(0),cnt(0),size(0){
son[0] = son[1] = nullptr;
} bool get(){
return fa->son[1] == this;
}
void update(){
size = son[1]->size + son[0]->size + cnt;
}
void clear(){
key = cnt = size = 0;
}
}tree[limit],*root,*null;
int n,tot;
node* make_tree_node(){
++tot;
tree[tot].son[0] = tree[tot].son[1] = tree[tot].fa = null;
return &tree[tot];
}
inline void rotate(node *cur){
node *fa = cur->fa,*grandfather = fa->fa;
int rt = cur->get(), rt2 = fa->get();
fa->son[rt] = cur->son[rt ^ 1];
fa->son[rt]->fa = fa;
cur->son[rt ^ 1] = fa;
fa->fa = cur;
cur->fa = grandfather;
if(grandfather != null)
grandfather->son[rt2] = cur;
fa->update();
cur->update();
}
inline void splay(node *cur){
for(node *fa = null ;(fa=cur->fa) != null;rotate(cur)) {
if (fa->fa != null) {
rotate((fa->get() == cur->get()) ? fa : cur);
}
}
root = cur;
}
inline void insert(int x){
if(root == null){
root = make_tree_node();
root->key = x;
root->cnt = root->size = 1;
return;
} for(node *cur = root,*fa = null; ; ){
if(x == cur->key){
cur->cnt++;
splay(cur);
return;
}
fa = cur;
cur = cur->son[x > cur->key];
if(cur == null){
fa->son[x > fa->key]= cur = make_tree_node();
cur->key = x;
cur->cnt=1;
cur->fa=fa;
splay(cur);
return;
}
}
}
int kth(int k){
//求解k大
for(node * cur = root;;){
if(cur->son[0] != null && k <= cur->son[0]->size){
cur = cur->son[0];
}else{
int left_size = cur->son[0]->size + cur->cnt;
if(k <= left_size)return cur->key;
k -= left_size;
cur = cur->son[1];
}
}
}
int rank(int x){
int ans = 0;
for(node * cur = root; ; ){
if(cur->son[0] != null && x < cur->key)cur = cur->son[0];
else{
ans += cur->son[0]->size;
if(cur->key == x){
splay(cur);
return ans;
}
ans += cur->cnt;
cur = cur->son[1];
}
}
}
node * pre(){//前驱
node * cur = root->son[0];
for(;cur->son[1] != null;cur = cur->son[1]);
return cur;
}
void del(int x){
::rank(x);
if(root->cnt > 1){
root->cnt--;
root->update();
return;
}
node * l = pre(), *oldroot = root;
splay(l);
l->son[1] = oldroot->son[1];
l->son[1]->fa = l;
oldroot->clear();
root->update();
}
int prev(node * rt, int val){
if(rt == null)return -INF;
if(val > rt->key)return max(rt->key,::prev(rt->son[1],val));
else return ::prev(rt->son[0],val);
}
int next(node * rt, int val){
if(rt == null)return INF;
if(val < rt->key)return min( rt->key,::next(rt->son[0],val));
else return ::next(rt->son[1],val);
}
int main() {
#ifdef LOCAL
FOPEN;
#endif
tot = 0;
null = root = &tree[0];
n = read();
insert(INF), insert(-INF);
while (n--){
int op = read(), x = read();
if(op == 1){
insert(x);
}else if(op == 2){
del(x);
}else if(op == 3){
ff(::rank(x));
}else if(op == 4){
ff(kth(x + 1));
}else if(op == 5){
ff(::prev(root, x));
}else{
ff(::next(root,x))
}
}
return 0;
}
Splay Tree
Splay树求第k大模板的更多相关文章
- poj 2985 The k-th Largest Group 树状数组求第K大
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8353 Accepted ...
- HDU 5249 离线树状数组求第k大+离散化
KPI Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- POJ 2985 Treap平衡树(求第k大的元素)
这题也能够用树状数组做,并且树状数组姿势更加优美.代码更加少,只是这个Treap树就是求第K大元素的专家--所以速度比較快. 这个也是从那本红书上拿的模板--自己找了资料百度了好久,才理解这个Trea ...
- 面试题:求第K大元素(topK)?
一.引言二.普通算法算法A:算法B:三.较好算法算法C:算法D:四.总结 一.引言 这就是类似求Top(K)问题,什么意思呢?怎么在无序数组中找到第几(K)大元素?我们这里不考虑海量数据,能装入内 ...
- 《数据结构与算法分析:C语言描述》读书笔记------练习1.1 求第K大的数
求一组N个数中的第k个最大者,设k=N/2. import java.util.Random; public class K_Max { /** * @param args */ //求第K大的数,保 ...
- 快排法求第k大
快排法求第k大,复杂度为O(n) import com.sun.media.sound.SoftTuning; import java.util.Arrays; import java.util.Ra ...
- HDU 2639 01背包求第k大
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- BZOJ2006:超级钢琴(ST表+堆求前K大区间和)
Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度 ...
- ACM_求第k大元素(两次二分)
求第k大 Time Limit: 6000/3000ms (Java/Others) Problem Description: 给定两个数组A和B,大小为N,M,每次从两个数组各取一个数相乘放入数组C ...
随机推荐
- expect ':' at 0, actual = (JSON转化异常解决)
这个报错我的问题主要是前端得到的JSON格式不是标准的JSON串,所以会报这个错, 解决办法 需要使用JSON.toJSONString()转换为标准的字符串
- Ubuntu17.10 React Native 环境搭建
React Native 环境搭建 环境:ubuntu17.10 安装依赖 必须安装的依赖有:Node.React Native 命令行工具以及 JDK 和 Andriod Studio. 安装nod ...
- 蒲公英 · JELLY技术周刊 Vol.29: 前端智能化在阿里的那些事
蒲公英 · JELLY技术周刊 Vol.29 前端智能化是指借助于 AI 和机器学习的能力拓展前端,使其拥有一些超出现阶段前端能力的特性,这将是未来前端方向中一场重要的变革.目前各家互联网厂商都有自己 ...
- deepin 20 镜像源
deepin 20 镜像源 ## Generated by deepin-installerdeb [by-hash=force] https://community-packages.deepin. ...
- 后端狗的Vue学习历程(一) - demo示例与基本逻辑语法
目录 demo的三部分结构 判断:v-if.v-else-if.v-else 循环:v-for 事件绑定 v-on:eventType 内容输入的双向绑定v-model 源码:Github demo的 ...
- CEF避坑指南(一)——编译并自制浏览器
CEF即Chromium Embedded Framework,Chrome浏览器嵌入式框架.我们可以从自制浏览器入手,深入学习它.它提供了接口供程序员们把Chrome放到自己的程序中.许多大型公司, ...
- Spring3的IOC的annotation学习笔记
以下记录了一个小小的Spring3的annotation的应用笔记. 文件列表: UserService-interface UserDao-interface UserServiceImpl-Use ...
- Design Principle vs Design Pattern 设计原则 vs 设计模式
Design Principle vs Design Pattern设计原则 vs 设计模式 来源:https://www.tutorialsteacher.com/articles/differen ...
- kali 更新msf
用leafpad打开,方便复制粘贴 leafpad /etc/apt/sources.list 然后复制下面的源覆盖原本的 deb http://mirrors.ustc.edu.cn/kali ka ...
- kali 系列学习10-渗透攻击MySQL数据库服务、PostgreSQL数据库服务、Tomcat服务和PDF文件
介绍使用MSFCONSOLE工具渗透攻击MySQL数据库服务.PostgreSQL数据库服务.Tomcat服务和PDF文件等. 6.4.1 渗透攻击MySQL数据库服务 MySQL是一个关系型数据库管 ...