bzoj3224: Tyvj 1728 普通平衡树(打个splay暖暖手)
(其实今天好热啊?
题目大意:插入,删除,k小,前驱后继,数的排名。
splay和treap裸题...过几天补个treap的
splay:
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#define which(x) (son[fa[x]][1]==x)
using namespace std;
const int extar[]={,-};
int fa[],count[],son[][],val[],data[];
int root,x,y,n,tot,xiugai;
void read(int &k)
{
k=;int f=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
void rotate(int x)
{
int f=fa[x];
bool k=which(x);
son[f][k]=son[x][!k];son[x][!k]=f;son[fa[f]][which(f)]=x;
if(son[f][k])fa[son[f][k]]=f;fa[x]=fa[f];fa[f]=x;
count[x]=count[f];
count[f]=count[son[f][]]+count[son[f][]]+val[f];
}
void splay(int x,int g)
{
while(fa[x]!=g)
{
int f=fa[x];
if(fa[f]==g)
{
rotate(x);
break;
}
if(which(x)^which(f))rotate(x);
else rotate(f);
rotate(x);
}
if(!g)root=x;
}
int search(int x,int y)
{
if(data[x]>y&&son[x][])return search(son[x][],y);
if(data[x]<y&&son[x][])return search(son[x][],y);
return x;
}
int ext(int x,int w)
{
int k=search(x,extar[w]);
splay(k,);
return data[k];
}
int pred(int w)
{
int k=search(root,w);
splay(k,);
if(data[k]<w)return data[k];
return ext(son[k][],);
}
int succ(int x)
{
int k=search(root,x);
splay(k,);
if(data[k]>x)return data[k];
return ext(son[k][],);
}
int rank(int x,int k)
{
if(k<=count[son[x][]])return rank(son[x][],k);
if(k<=(count[son[x][]]+val[x]))return x;
return rank(son[x][],k-count[son[x][]]-val[x]);
}
int findnum(int x)
{
int k=search(root,x);
splay(k,);
return count[son[k][]]+;
}
void insert(int &x,int w,int f)
{
if(!x)
{
x=++tot;
count[x]=val[x]=;
data[x]=w;
fa[x]=f;
xiugai=tot;
return;
}
if(data[x]==w)val[x]++,xiugai=x;
if(data[x]<w)insert(son[x][],w,x);
if(data[x]>w)insert(son[x][],w,x);
count[x]++;
}
void del(int w)
{
int k=search(root,w);
splay(k,);
if(data[k]==w)
{
if(val[k]>)val[k]--,count[k]--;
else
if(!son[k][])
{
root=son[k][];
fa[root]=fa[k]=son[k][]=count[k]=val[k]=data[k]=;
}
else
{
fa[son[k][]]=;ext(son[k][],);
son[root][]=son[k][];
if(son[k][])fa[son[k][]]=root;
count[root]+=count[son[k][]];
fa[k]=son[k][]=son[k][]=data[k]=val[k]=count[k]=;
}
}
}
int main()
{
read(n);
for(int i=;i<=n;i++)
{
read(x);read(y);
switch(x)
{
case :insert(root,y,);splay(xiugai,);root=xiugai;break;
case :del(y);break;
case :printf("%d\n",findnum(y));break;
case :printf("%d\n",data[rank(root,y)]);break;
case :printf("%d\n",pred(y));break;
case :printf("%d\n",succ(y));break;
default:break;
}
}
}
bzoj3224: Tyvj 1728 普通平衡树(打个splay暖暖手)的更多相关文章
- bzoj3224: Tyvj 1728 普通平衡树(平衡树)
bzoj3224: Tyvj 1728 普通平衡树(平衡树) 总结 a. cout<<(x=3)<<endl;这句话输出的值是3,那么对应的,在splay操作中,当父亲不为0的 ...
- [BZOJ3224]Tyvj 1728 普通平衡树
[BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...
- bzoj3224: Tyvj 1728 普通平衡树(splay)
3224: Tyvj 1728 普通平衡树 题目:传送门 题解: 啦啦啦啦又来敲个模版水经验啦~ 代码: #include<cstdio> #include<cstring> ...
- bzoj3224 Tyvj 1728 普通平衡树(名次树+处理相同)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5354 Solved: 2196[Submit][Sta ...
- 绝对是全网最好的Splay 入门详解——洛谷P3369&BZOJ3224: Tyvj 1728 普通平衡树 包教包会
平衡树是什么东西想必我就不用说太多了吧. 百度百科: 一个月之前的某天晚上,yuli巨佬为我们初步讲解了Splay,当时接触到了平衡树里的旋转等各种骚操作,感觉非常厉害.而第二天我调Splay的模板竟 ...
- 【Splay】bzoj3224 Tyvj 1728 普通平衡树
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> us ...
- [bzoj3224]Tyvj 1728 普通平衡树——splay模板
题目 你需要写一种数据结构支援以下操作. 插入元素. 删除元素. 查询元素的排名. 查询第k小的元素. 查询元素前趋. 查询元素后继. 题解 BBST裸题. 代码 #include <cstdi ...
- 【权值分块】bzoj3224 Tyvj 1728 普通平衡树
权值分块和权值线段树的思想一致,离散化之后可以代替平衡树的部分功能. 部分操作的时间复杂度: 插入 删除 全局排名 全局K大 前驱 后继 全局最值 按值域删除元素 O(1) O(1) O(sqrt(n ...
- 【权值线段树】bzoj3224 Tyvj 1728 普通平衡树
一个板子. #include<cstdio> #include<algorithm> using namespace std; #define N 100001 struct ...
随机推荐
- Java开发工程师(Web方向) - 04.Spring框架 - 第1章.Spring概述
第1章.Spring概述 Spring概述 The Spring Framework is a lightweight solution and a potential one-stop-shop f ...
- python3 SQLAlchemy模块使用
更详细的操作介绍:https://www.imooc.com/article/22343 定义: SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对 ...
- ionic LoadingController 模块使用
html 代码: <ion-header> <ion-navbar> <ion-title>Loading</ion-title> </ion-n ...
- mysql 按日期统计
按年汇总,统计: select sum(mymoney) as totalmoney, count(*) as sheets from mytable group by date_format(col ...
- python 读取 log日志的编码问题
1.我要读取log日志的”执行成功”的个数,log日志编码格式为GBK 2.显示报错,大致意思是说utf-8的代码不能解析log日志 3.后来想想把log日志用GBK编码读出来,写到新文件中,用utf ...
- LeetCode - 412. Fizz Buzz - ( C++ ) - 解题报告 - to_string
1.题目大意 Write a program that outputs the string representation of numbers from 1 to n. But for multip ...
- BZOJ 3924 ZJOI2015 幻想乡战略游戏 树链剖分
题目链接:https://www.luogu.org/problemnew/show/P3345(bzoj权限题) 题意概述:动态维护树的上所有点到这棵树的带权重心的距离和.N,Q<=10000 ...
- 什么是Frozen Binary
对于Python来说,你可以将Python的字节码,PVM(也就是解析器),以及需要的相关类库,打包成一个package,这个package实际上是一个二进制可执行文件,这样,用户获取到这个packa ...
- 条款02:尽量以const,enum,inline替换#define
一.概述 尽量少用预处理器——宏替换 二.细节 1. 关于宏替换之常量 旧版本:#define N 10; 新版本:const int n = 10; 比较:#define不被视为语言的一部分,记号名 ...
- javabean的内省技术和BeanUtils的使用
一.关于javabean javabean是固定写法的java类 书写格式为: 1)必须有无参构造函数 2)属性必须私有, 我们称为字段 3)提供标准的getter和setter 例: name 字段 ...