解题关键:splay模板题整理。

如何不加入极大极小值?(待思考)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cstdlib>
using namespace std;
typedef long long ll;
const int N = ;
int ch[N][],par[N],val[N],cnt[N],size[N],ncnt,root; bool chk(int x){
return ch[par[x]][]==x;
} void pushup(int x){
size[x]=size[ch[x][]]+size[ch[x][]]+cnt[x];//和线段树不同的是需要+上自身的cnt
} void rotate(int x){
int y=par[x],z=par[y],k=chk(x),w=ch[x][k^];
ch[y][k]=w;par[w]=y;
ch[z][chk(y)]=x;par[x]=z;
ch[x][k^]=y;par[y]=x;
pushup(y);pushup(x);
} void splay(int x,int goal=){
while(par[x]!=goal){
int y=par[x],z=par[y];
if(z!=goal){
if(chk(x)==chk(y)) rotate(y);
else rotate(x);
}
rotate(x);
}
if(!goal) root=x;
} void insert(int x){
int cur=root,p=;
while(cur&&val[cur]!=x){
p=cur;
cur=ch[cur][x>val[cur]];
}
if(cur){
cnt[cur]++;
}else{
cur=++ncnt;
if(p) ch[p][x>val[p]]=cur;
ch[cur][]=ch[cur][]=;
par[cur]=p;val[cur]=x;
cnt[cur]=size[cur]=;
}
splay(cur);
} void find(int x){
int cur=root;
if(!cur) return;
while(ch[cur][x>val[cur]]&&x!=val[cur]){
cur=ch[cur][x>val[cur]];
}
splay(cur);
}
//从0开始
int kth(int k){
k++;
int cur=root;
while(){
if(ch[cur][]&&k<=size[ch[cur][]]){
cur=ch[cur][];
}else if(k>size[ch[cur][]]+cnt[cur]){
k-=size[ch[cur][]]+cnt[cur];
cur=ch[cur][];
}else{
return cur;
}
}
} int rnk(int x){
find(x);
if(val[root]>=x) return size[ch[root][]];
else return size[ch[root][]]+cnt[root];
} int pre(int x){
find(x);
if(val[root]<x) return root;
int cur=ch[root][];
while(ch[cur][]) cur=ch[cur][];
return cur;
} int succ(int x) {
find(x);
if(val[root]>x) return root;
int cur=ch[root][];
while(ch[cur][]) cur=ch[cur][];
return cur;
} void remove(int x) {
int last=pre(x),nxt=succ(x);
splay(last);splay(nxt,last);
int del=ch[nxt][];
if(cnt[del]>){
cnt[del]--;
splay(del);
}
else ch[nxt][]=;
} void init(){
insert(-2e9);
insert(2e9);
} int n,op,x; int main() {
scanf("%d",&n);
init();
while(n--){
scanf("%d%d",&op,&x);
switch(op){
case : insert(x); break;
case : remove(x); break;
case : printf("%d\n",rnk(x)); break;
case : printf("%d\n",val[kth(x)]); break;
case : printf("%d\n",val[pre(x)]); break;
case : printf("%d\n",val[succ(x)]); break;
}
}
}

[luogu3369/bzoj3224]普通平衡树(splay模板、平衡树初探)的更多相关文章

  1. Hihocoder 1329 平衡树·Splay(平衡树)

    Hihocoder 1329 平衡树·Splay(平衡树) Description 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. 小Hi:怎么了? 小Ho:小H ...

  2. [洛谷P3391] 文艺平衡树 (Splay模板)

    初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...

  3. bzoj3224 普通平衡树(splay 模板)

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 11427  Solved: 4878[Submit][St ...

  4. bzoj3224 普通平衡树 splay模板

    题目传送门 题目大意:完成一颗splay树. 思路:模板题,学着还是很有意思的. 学习splay树:蒟蒻yyb 该题模板:汪立超 #include<bits/stdc++.h> #defi ...

  5. [bzoj3224]Tyvj 1728 普通平衡树——splay模板

    题目 你需要写一种数据结构支援以下操作. 插入元素. 删除元素. 查询元素的排名. 查询第k小的元素. 查询元素前趋. 查询元素后继. 题解 BBST裸题. 代码 #include <cstdi ...

  6. P3369 【模板】普通平衡树 (splay 模板)

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1.若有多 ...

  7. 【BZOJ3224】Tyvj 1728 普通平衡树 Splay

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...

  8. BZOJ3224 洛谷3369 Tyvj 1728 普通平衡树 splay

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3224 题意概括 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. ...

  9. BZOJ3224/洛谷P3391 - 普通平衡树(Splay)

    BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...

随机推荐

  1. Leetcode 1015. Smallest Integer Divisible by K

    思路显然是暴力枚举. 但是两个问题: 1.当1的位数非常大时,模运算很费时间,会超时. 其实每次不用完全用'11111...'来%K,上一次的余数*10+1后再%K就行. 证明: 令f(n)=1111 ...

  2. 关于this指向问题的总结【转自秘密花园】

    this 的工作原理 JavaScript 有一套完全不同于其它语言的对 this 的处理机制. 在五种不同的情况下 ,this 指向的各不相同. 第一种:全局范围内 this; 当在全部范围内使用  ...

  3. bzoj 3192 删除物品

    Written with StackEdit. Description 箱子再分配问题需要解决如下问题: (1)一共有\(N\)个物品,堆成\(M\)堆. (2)所有物品都是一样的,但是它们有不同的优 ...

  4. yield 与生成器

    yield的功能类似于return,但是不同之处在于它返回的是生成器. 生成器 生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器). 如果一个函数 ...

  5. YARN学习笔记——Overview and Architecture

    YARN的简介 什么是YARN MRv1的架构和缺陷 经典MapReduce的局限性 解决可伸缩性问题 YARN的架构 一个可运行任何分布式应用程序的集群 YARN中的应用程序提交 YARN的其他特性 ...

  6. SCARA——OpenGL入门学习五六(三维变换、动画)

    OpenGL入门学习(五) 此课为三维变换的内容,比较枯燥.主要是因为很多函数在单独使用时都不好描述其效果, 在前面绘制几何图形的时候,大家是否觉得我们绘图的范围太狭隘了呢?坐标只能从-1到1,还只能 ...

  7. [ArgumentException: 可能证书“CN=JRNet01-PC”没有能够进行密钥交换的私钥,或者进程可能没有访问私钥的权限。有关详细信息,请参见内部异常。]

    堆栈跟踪: [CryptographicException: 密钥集不存在. ] System.Security.Cryptography.Utils.CreateProvHandle(CspPara ...

  8. 【java规则引擎】基本语法和相关属性介绍

    一个规则的语法信息 [1]条件部分(LSH部分)===>规则pattern之间的连接条件符号:   (1)LHS 部分是由一个或多个条件组成,条件又称之为 pattern(匹配模式),多个 pa ...

  9. OracleAWR删除历史快照说明

    测试时,发现无法产生新快照,查看系统时间为10月26,但是已经产生快照为12月1号了. 此时的解决办法,就是删除现有的快照. 转http://itlab.idcquan.com/Oracle/back ...

  10. Eclipse自动生成 get/set

    步骤一:在声明的数据域中按Ctrl+1: 步骤二:点击最后一个选项Create getter and setter,在弹出的对话框中点击确定: 在介绍另外一个方法: 步骤一:声明完类的数据域之后,输入 ...