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 ...
随机推荐
- Java_枚举
枚举 JDK1.5引入枚举类型, 枚举类型的定义包括枚举的声明和枚举体 enum Season { SPRING, SUMMER, AUTUMN, WINDER } 所有的枚举类型隐性的继承来自jav ...
- JAVA每日一题20201109
一.标识符的规则? 1.严格区分大小写,不能使用关键字,保留字,不能重复 2.数字不能开头 二.标识符的命名规范 包名:XXXYYYZZZ 类名,接口名:XxYyZz 变量名,方法名:xxxYyyZz ...
- 剑指Offer-Python(16-20)
16.合并另个排序链表 # -*- coding:utf-8 -*- class ListNode: def __init__(self, x): self.val = x self.next = N ...
- 【开发板试用报告】鸿蒙OS环境搭建及代码烧录
鸿蒙系统的代码编译环境需要linux系统,软件开发和代码烧录需要windows环境. Linux环境 参考官方链接:https://gitee.com/openharmony/docs/blob/ma ...
- 对于STM32F103的USART的通讯调试
USART:(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步串行接收/发送器USART是一个全双工通用同步/异步串行收发 ...
- 小谢第58问:nuxt搭建企业官网
最近公司要重构公司官网,jq+bootstrap 改为了vue,刚开始我以为用vue不是挺好的嘛,后来才发现,有于vue单页面的特性,不利于搜索引擎的抓取,因此在seo方面需要另外想办法,于是乎,就找 ...
- 使用GitHub API上传文件及GitHub做图床
本文介绍GitHub API基础及上传文件到仓库API,并应用API将GitHub作为图床 GitHub API官方页面 GitHub API版本 当前版本为v3,官方推荐在请求头中显示添加版本标识. ...
- Html+css 一个简单的网页模板
一个简单的网页模板,有导航.子菜单.banner部分 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN&q ...
- 《金融业人工智能实践 》(Hands-On Artificial Intelligence for Banking) 阅读指南 - 第5章
术语中英互查: Morningstar Style Box - 晨星投资风格箱方法 (该翻译来自于晨星中国官网,权威得不能再权威了 https://cn.morningstar.com/help/da ...
- Linux文件监控工具——inotify-tools
举例: ip.txt内容如下: 10.1.1.11 root 123 10.1.1.22 root 111 10.1.1.33 root 123456 10.1.1.44 root 54321 写法1 ...