bzoj3224 splay板子
开始学习新知识:splay——tree
是个板子题,学习splay可以看博客
https://blog.csdn.net/Clove_unique/article/details/50630280
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define MAXN 1000000
int ch[MAXN][],f[MAXN],size[MAXN],cnt[MAXN],key[MAXN];
int sz,root;
inline void clear(int x){
ch[x][]=ch[x][]=f[x]=size[x]=cnt[x]=key[x]=;
}
inline bool get(int x){
return ch[f[x]][]==x;
}
inline void update(int x){//更新结点x的size
if(x){
size[x]=cnt[x];
if(ch[x][]) size[x]+=size[ch[x][]];
if(ch[x][]) size[x]+=size[ch[x][]];
}
}
inline void rotate(int x){//一次旋转
//得到x的父亲,爷爷,是不是左子树
int old=f[x],oldf=f[old],whichx=get(x);
ch[old][whichx]=ch[x][whichx^];
f[ch[old][whichx]]=old; ch[x][whichx^]=old;f[old]=x; f[x]=oldf;
if(oldf) ch[oldf][ch[oldf][]==old]=x; update(old);update(x);//不要忘记更新size
}
inline void splay(int x){
for(int fa;fa=f[x];rotate(x))//再把x翻上来
if(f[fa])//如果fa非根,且x和fa是同一侧,那么先翻转fa,否则先翻转x
rotate((get(x)==get(fa))?fa:x); root=x;//最后把x设为root
}
inline void insert(int x){
if(root==){//插到空树里
sz++;ch[sz][]=ch[sz][]=f[sz]=;
root=sz;size[sz]=cnt[sz]=;key[sz]=x;
return;
}
int now=root,fa=;
while(){//不断往下寻找直到找到对应值
if(x==key[now]){
cnt[now]++;update(now);update(fa);
splay(now);break;//把now置顶
}
fa=now;
now=ch[now][key[now]<x];//往下搜索x
if(now==){//新建结点
sz++;ch[sz][]=ch[sz][]=;
f[sz]=fa;
size[sz]=cnt[sz]=;
ch[fa][key[fa]<x]=sz;
key[sz]=x;
update(fa);
splay(sz);//把sz置顶
break;
}
}
}
inline int find(int x){//寻找x所在位置(排名)
int now=root,ans=;
while(){
if(x<key[now])//往左子树搜索
now=ch[now][];
else {
ans+=(ch[now][]?size[ch[now][]]:);
//找到对应的键值,置顶now,返回
if(x==key[now]){splay(now);return ans+;}
ans+=cnt[now];
now=ch[now][];//往右子树
}
}
}
inline int findx(int x){//找第x名的值
int now=root;
while(){
if(ch[now][] && x<=size[ch[now][]])
now=ch[now][];//往左子树搜索
else {
int temp=(ch[now][]?size[ch[now][]]:)+cnt[now];//
if(x<=temp)
return key[now];
x-=temp;now=ch[now][];//往右子树搜索
}
}
}
inline int pre(){//前驱即左子树里的最大值
int now=ch[root][];
while(ch[now][]) now=ch[now][];
return now;
}
inline int next(){//后继是右子树里的最小值
int now=ch[root][];
while(ch[now][]) now=ch[now][];
return now;
}
inline void del(int x){
int whatever=find(x);//只是把x置顶
//x的个数>1
if(cnt[root]>){cnt[root]--;update(root);return;}
//单个x
if(!ch[root][] && !ch[root][]){clear(root);root=;return;}
//只有左子树或者只有右子树
if(!ch[root][]){//删掉根,右儿子做根
int oldroot=root;root=ch[root][];f[root]=;clear(oldroot);return;
}
if(!ch[root][]){
int oldroot=root;root=ch[root][];f[root]=;clear(oldroot);return;
}
//前驱作为根(前驱是没有右儿子的),右子树挂到前驱的右子树,删掉根
else {
int pree=pre(),oldroot=root;
splay(pree);
ch[root][]=ch[oldroot][];
f[ch[oldroot][]]=pree;
clear(oldroot);
update(pree);
}
}
int main(){
int n,op,x;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d",&op,&x);
switch(op){
case :insert(x);break;
case :del(x);break;
case :printf("%d\n",find(x));break;
case :printf("%d\n",findx(x));break;
case :insert(x);printf("%d\n",key[pre()]);del(x);break;
case :insert(x);printf("%d\n",key[next()]);del(x);break;
}
}
}
bzoj3224 splay板子的更多相关文章
- [bzoj] 1588 营业额统计 || Splay板子题
		原题 给出一个n个数的数列ai ,对于第i个元素ai定义\(fi=min(|ai-aj|) (1<=j<i)\),f1=a1,求\(/sumfi\) Splay板子题. Splay讲解:h ... 
- POJ - 3481 splay板子
		Double Queue 默写splay板子 很多细节问题... #include<cstdio> #include<iostream> using namespace std ... 
- 个人整理的数组splay板子,指针的写的太丑了就不放了。。
		splay的板子.. 由于被LCT榨干了..所以昨天去学了数组版的splay,现在整理一下板子.. 以BZOJ3224和3223为例题..暂时只有这些,序列的话等有时间把维修序列给弄上来!! BZOJ ... 
- 【填坑】bzoj3224 splay裸题
		人生第一道splay不出所料是一道裸题,一道水题,一道2k代码都不到的题 #include <cstdio> ,n,p,q; ],c[][],size[],sp[]; void rot(i ... 
- splay板子
		1, splay的一些基本操作. 使用前要插入$-INF,+INF$保证每个点的前驱后继存在. $get$函数在$x$存在时, 调用后, 根为$x$, 否则根为$x$的前驱或后继 const int ... 
- BZOJ 3224 Tyvj 1728 普通平衡树 | Splay 板子+SPlay详细讲解
		下面给出Splay的实现方法(复杂度证明什么的知道是 nlogn 就可以啦) 首先对于一颗可爱的二叉查找树,是不能保证最坏nlogn的复杂度(可以想象把一个升序序列插入) (二叉查找树保证左子树元素大 ... 
- BZOJ[NOI2004]郁闷的出纳员 | Splay板子题
		题目: 洛谷也能评测....还有我wa了10多次的记录233 题解: 不要想得太复杂,搞一个全局变量记录一下工资的改变量Delta,这样可以等询问的时候就输出val+Delta,然后插入的时候插入x- ... 
- P3369 【模板】普通平衡树(splay)
		P3369 [模板]普通平衡树 就是不用treap splay板子,好好背吧TAT #include<iostream> #include<cstdio> #include&l ... 
- 【题解】 [HNOI2004]宠物收养场(Splay)
		懒得复制,戳我戳我 Solution: \(Splay\)板子,注意交换的地方,然后就是注意不要越界node[x],应该是\(node[now]\),其次就是数组可以开大点 Code: //It is ... 
随机推荐
- mac 本上对 rar 压缩包解压
			以前从晚上各种找软件对 xxx.rar 压缩包文件进行解压,也确实找到过那么几个,要不是不好用就是解压完有乱码,很是头疼. 这次又遇到这样的问题,于是下定决心将这个问题彻底解决好,经过验证,总结一下最 ... 
- Hadoop基础-HDFS的API常见操作
			Hadoop基础-HDFS的API常见操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本文主要是记录一写我在学习HDFS时的一些琐碎的学习笔记, 方便自己以后查看.在调用API ... 
- git协同开发
			当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin. 要查看远程库的信息,用git remote: [root@w ... 
- IDEA中阿里JAVA代码规范插件(P3C)的安装及使用
			JAVA代码规范插件(P3C)是阿里巴巴2017年10月14日在杭州云栖大会上首发的,使之前的阿里巴巴JAVA开发手册正式以插件形式公开走向业界.插件的相关信息及安装包都可以在GitHub(https ... 
- Git与GitHub学习笔记(五)一次提交失败的记录
			代码已经跟踪了,添加注释说明,但是总是添加不了 error: pathspec 'live-page'' did not match any file(s) known to git. 重复了好多遍, ... 
- 寻路优化(二)——二维地图上theta*算法的设计探索
			这篇文章是基于上一篇文章的研究上进行的,使得路径更加的平滑和自然,特此记录.有错误欢迎大家批评指正.如需转载请注明出处,http://www.cnblogs.com/Leonhard-/p/68660 ... 
- POJ3436 ACM Computer Factory【EK算法】
			题意: 每个电脑需要P个组成部分,现有N的机器,每个机器都可以对电脑进行加工,不过加工的前提是某些部分已经存在,加工后会增加某些部分.且在单位时间内,每个机器的加工都有一个最大加工容量,求能得到的最大 ... 
- java先导课程学习总结
			经过两个星期四节课的java学习,我也对java这门语言有了一定的认识.刚开始上课的时候,我认为java把C语言中老师所说的模块化编程进行了强调,进行一个类,一个类的编程,在类中构造相应的方法,使用的 ... 
- Eclipse通用设置
			分类 Eclipse分为64位.32位,安装版.免安装版 查看Eclipse版本信息 Help - About Eclipse - Installation Details 
- 2018-2019-2 网络对抗技术 20165230 Exp6 信息搜集与漏洞扫描
			目录 1.实验内容 2.实验过程 任务一:各种搜索技巧的应用 通过搜索引擎进行信息搜集 搜索网址目录结构 使用IP路由侦查工具traceroute 搜索特定类型的文件 任务二:DNS IP注册信息的查 ... 
