今天上午借着休息日得机会手撸了一下模板,终于对着模板调出来了。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大模板的更多相关文章

  1. poj 2985 The k-th Largest Group 树状数组求第K大

    The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8353   Accepted ...

  2. HDU 5249 离线树状数组求第k大+离散化

    KPI Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. POJ 2985 Treap平衡树(求第k大的元素)

    这题也能够用树状数组做,并且树状数组姿势更加优美.代码更加少,只是这个Treap树就是求第K大元素的专家--所以速度比較快. 这个也是从那本红书上拿的模板--自己找了资料百度了好久,才理解这个Trea ...

  4. 面试题:求第K大元素(topK)?

    一.引言二.普通算法算法A:算法B:三.较好算法算法C:算法D:四.总结 一.引言 ​ 这就是类似求Top(K)问题,什么意思呢?怎么在无序数组中找到第几(K)大元素?我们这里不考虑海量数据,能装入内 ...

  5. 《数据结构与算法分析:C语言描述》读书笔记------练习1.1 求第K大的数

    求一组N个数中的第k个最大者,设k=N/2. import java.util.Random; public class K_Max { /** * @param args */ //求第K大的数,保 ...

  6. 快排法求第k大

    快排法求第k大,复杂度为O(n) import com.sun.media.sound.SoftTuning; import java.util.Arrays; import java.util.Ra ...

  7. HDU 2639 01背包求第k大

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. BZOJ2006:超级钢琴(ST表+堆求前K大区间和)

    Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度 ...

  9. ACM_求第k大元素(两次二分)

    求第k大 Time Limit: 6000/3000ms (Java/Others) Problem Description: 给定两个数组A和B,大小为N,M,每次从两个数组各取一个数相乘放入数组C ...

随机推荐

  1. HashMap的初始化,到底都做了什么?

    HashMap的初始化,到底都做了什么? HashMap初始化参数都是什么?默认是多少? 为什么建议初始化设置容量? tableSizeFor方法是做什么的? 如何获取到一个key的hash值?及计算 ...

  2. Elasticsearch 注册windows服务后,服务启动失败,意外终止

    直接双击elasticsearch.bat可以成功启动,注册成服务后就启动失败 从网上查找问题,发现是jdk版本的问题,用ES自带的jdk就可以启动成功. 默认ES会先找JAVA_HOME环境变量,如 ...

  3. leetcode75:search-a-2d-matrix

    题目描述 请写出一个高效的在m*n矩阵中判断目标值是否存在的算法,矩阵具有如下特征: 每一行的数字都从左到右排序 每一行的第一个数字都比上一行最后一个数字大 例如: 对于下面的矩阵: [ [1, 3, ...

  4. linux netfilter nat1

    linux netfilter nat1 2020整理云笔记上传

  5. 《GNU_makefile》——第八章 内嵌函数

    函数可以带参数,函数的展开方式和变量展开一样,函数的返回结果替换调用函数的文本. 1.函数的调用 $(FUNCTION ARGUMENTS) 或者: ${FUNCTION ARGUMENTS} FUN ...

  6. prop()和attr()我该翻谁的牌子?

    先上代码: // 全选 function CheckAll() { if ($("#th_checkbox").prop('checked')) $('input[name=&qu ...

  7. 如何在所有的mon的损坏情况下将数据恢复如初

    本篇主题 在mon无法启动,或者所有的mon的数据盘都损坏的情况下,如何把所有的数据恢复如初 写本章的缘由 在ceph中国的群里有看到一个技术人员有提到,在一次意外机房掉电后,三台mon的系统盘同时损 ...

  8. 2020-11-02(三年之约D92)-优秀不是一种行为,而是一种习惯

    1.阅读:<软技能-代码之外的生存指南>- 第45章 培养习惯:刷新你的代码 成就我们的恰恰就是那些不断重复做的事情.因此,优秀不是一种行为,而是一种习惯--亚里士多德 习惯主要由三个要素 ...

  9. [web安全原理分析]-XEE漏洞入门

    前言 1 前言 XXE漏洞 XXE漏洞全称(XML External Entity Injection)即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致 ...

  10. webug第十四关:存储型XSS

    第十四关:存储型XSS 打开发现是评论区 留言加入xss语句