今天上午借着休息日得机会手撸了一下模板,终于对着模板调出来了。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. svg究竟是什么?

    svg究竟是什么? 1 要点 要点1:svg与jpg/png等格式的用途完全不同,不可相提并论,没有可比性,不可互相替代. 要点2:日常生活中,我们用相机拍摄自然景象得到的照片和视频,能且只能用jpg ...

  2. DP斜率优化学习笔记

    斜率优化 首先,可以进行斜率优化的DP方程式一般式为$dp[i]=\max_{j=1}^{i-1}/\min_{j=1}^{i-1}\{a(i)*x(j)+b(i)*y(j)\}$ 其中$a(j)$和 ...

  3. 解决windows下Chrome78以上跨域失效问题

    1. 为什么需要解决chrome浏览器跨域的问题? 基于Hybird App的H5部分,可以直接打包进apk或者ipa包中,在开发过程中也不需要放置到临时搭建的服务器上,直接在本地打开html静态页面 ...

  4. python的各版本的不同

    Python的版本主要分为 2.× . 3.× 两个系列. Python3计划每年发布一个新的子版本,一次只增加一两种新语法. 使用时当然选择越新的Python版本越好,版本越老的代码越难维护. 维护 ...

  5. laravel 控制器中获取不到session

    protected $middleware = [ \Illuminate\Session\Middleware\StartSession::class, ]; 在 kernel.php中 加入Sta ...

  6. 三、分布式编程总结------linux多线程服务端编程

  7. SQL IsNull函数详解

    IsNull,计算机语言函数,意思是返回 Boolean 值,指明表达式是否不包含任何有效数据 (Null). ISNULL 使用指定的替换值替换 NULL. IS NULL经常用于组成一个逻辑表达式 ...

  8. property内置装饰器函数和@name.setter、@name.deleter

    # property # 内置装饰器函数 只在面向对象中使用 # 装饰后效果:将类的方法伪装成属性 # 被property装饰后的方法,不能带除了self外的任何参数 from math import ...

  9. weblogic ssrf 漏洞笔记

    CVE-2014-4210 Oracle WebLogic web server即可以被外部主机访问,同时也允许访问内部主机.比如有一个jsp页面SearchPublicReqistries.jsp, ...

  10. 如何用思维导图软件MindManager制作项目管理图表

    项目管理的官方解释为:运用各种相关技能.方法与工具,为满足或超越项目有关各方对项目的要求与期望,所开展的各种计划.组织.领导.控制等方面的活动. 其实使用MindManager思维导图软件来创建项目管 ...