[bzoj] 3224 Tyvj 1728 普通平衡树 || 平衡树板子题
#include<cstdio>
#define N 100010
#define which(x) (ls[f[(x)]]==(x))
using namespace std;
int n,m,ls[N],rs[N],val[N],sze[N],cnt[N],f[N],root,idx;
int read()
{
int ans=0,fu=1;
char j=getchar();
for (;j<'0' || j>'9';j=getchar()) if (j=='-') fu=-1;
for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
return ans*fu;
}
void updt(int x)
{
sze[x]=sze[ls[x]]+sze[rs[x]]+1;
}
void Rotate(int u)
{
int v=f[u],w=f[v],b=which(u)?rs[u]:ls[u];
if (w) which(v)?rs[w]=u:ls[w]=u;
which(u)?(ls[v]=b,rs[u]=v):(rs[v]=b,ls[u]=v);
f[u]=w,f[v]=u;
if (b) f[b]=v;
updt(v),updt(u);
}
void Splay(int x,int tar)
{
while (f[x]!=tar)
{
if (f[f[x]]!=tar)
{
if (which(f[x])==which(x)) Rotate(f[x]);
else Rotate(x);
}
Rotate(x);
}
if (!tar) root=x;
}
int find(int x)
{
int u=root,v=0;
while (u && val[u]!=x)
{
v=u;
if (x<val[u]) u=ls[u];
else u=rs[u];
}
return u?u:v;
}
void insert(int x)
{
int u=root,v=0;
while (u && val[u]!=x)
{
v=u;
if (x<=val[u]) u=ls[u];
else u=rs[u];
}
if (u && val[u]==x)
return (void)(cnt[u]++,sze[u]++,Splay(u,0));
f[++idx]=v;
sze[idx]=1;
val[idx]=x;
if (v) x<=val[v]?ls[v]=idx:rs[v]=idx;
Splay(idx,0);
}
int getmn(int x)
{
while (ls[x]) x=ls[x];
return x;
}
int getmx(int x)
{
while (rs[x]) x=rs[x];
return x;
}
void erase(int x)
{
int tmp=find(x);
Splay(tmp,0);
if (cnt[tmp]>1) cnt[tmp]--,sze[tmp]--;
else if (!ls[tmp] || !rs[tmp]) root=ls[tmp]+rs[tmp],f[root]=0;
else
{
f[ls[tmp]]=0;
int u=getmx(ls[tmp]);
Splay(u,0);
rs[u]=rs[tmp];
f[rs[tmp]]=u;
updt(u);
}
}
int getkth(int k)
{
int cur=root;
while (cur)
{
if (sze[ls[cur]]>=k) cur=ls[cur];
else if (sze[ls[cur]]+cnt[cur]>=k) return val[cur];
else k-=sze[ls[cur]]+cnt[cur],cur=rs[cur];
}
return val[cur];
}
int getrank(int x)
{
int cur=find(x);
Splay(cur,0);
return sze[ls[cur]]+1;
}
int getpre(int x)
{
int cur=find(x);
if (val[cur]<x) return val[cur];
Splay(cur,0);
return val[getmx(ls[cur])];
}
int getnxt(int x)
{
int cur=find(x);
if (val[cur]>x) return val[cur];
Splay(cur,0);
return val[getmn(rs[cur])];
}
int main()
{
n=read();
for (int i=1,op,a;i<=n;i++)
{
op=read();
a=read();
printf("%d %d\n",op,a);
if (op==1) insert(a);
if (op==2) erase(a);
if (op==3) printf("%d\n",getrank(a));
if (op==4) printf("%d\n",getkth(a));
if (op==5) printf("%d\n",getpre(a));
if (op==6) printf("%d\n",getnxt(a));
}
return 0;
}
[bzoj] 3224 Tyvj 1728 普通平衡树 || 平衡树板子题的更多相关文章
- BZOJ 3224: Tyvj 1728 普通平衡树
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9629 Solved: 4091[Submit][Sta ...
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 7390 Solved: 3122 [Submit][S ...
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...
- BZOJ 3224: Tyvj 1728 普通平衡树 vector
3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...
- BZOJ 3224: Tyvj 1728 普通平衡树(BST)
treap,算是模板题了...我中间还一次交错题... -------------------------------------------------------------------- #in ...
- BZOJ 3224: Tyvj 1728 普通平衡树 or 洛谷 P3369 【模板】普通平衡树-Splay树模板题
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 22483 Solved: 10130[Submit][S ...
- BZOJ 3224 Tyvj 1728 普通平衡树 | Splay 板子+SPlay详细讲解
下面给出Splay的实现方法(复杂度证明什么的知道是 nlogn 就可以啦) 首先对于一颗可爱的二叉查找树,是不能保证最坏nlogn的复杂度(可以想象把一个升序序列插入) (二叉查找树保证左子树元素大 ...
- BZOJ 3224 Tyvj 1728 普通平衡树模板
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 题目大意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以 ...
- bzoj 3224/Tyvj 1728 普通平衡树(splay)
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...
随机推荐
- activemq启动闪退/失败 (Illegal character in hostname at index 5: ws://****:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600)
java.net.URISyntaxException: Illegal character in hostname at index 5: ws://****:61614?maximumConnec ...
- elasticsearch-dsl笔记
一.elasticsearch安装 安装java1.8以上 安装elasticsearch-rtf(https://github.com/medcl/elasticsearch-rtf) head插件 ...
- 使用c++控制sqlite3
首先,到官网下载相关的压缩包 https://www.sqlite.org/download.html 但是要自己再重新编译一个, 博主自己收集了一下,密码:hixo https://pan.baid ...
- XStream 工具类 [ XmlUtil ]
pom.xml <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId> ...
- php 利用composer引用第三方类库构建项目
经常看到各种开源库推荐使用 composer 安装代码,却总是看不懂怎么用composer, 这几天静下心来学习了composer的使用,发现这可真是一个好东西,先贴上一个讲的很棒的视频教程: PHP ...
- ASPX页面请求响应过程
- HDU 5446 Unknown Treasure (卢卡斯+CRT
代码: #include"bits/stdc++.h" #define db double #define ll long long #define vec vector<l ...
- python创建字典
创建: {x:x**2 for x in (2,4,6)} dict(xjm=110,lxh=119,pzq=120) dict([('a',1),('b',2),('c',3)])
- win10 解决“ 'g++' 不是内部或外部命令,也不是可运行的程序或批处理文件”的问题
https://www.jianshu.com/p/9bffbaf12bed 2. 安装MinGW 将MinGW安装在D:\mingw文件夹下(可自由选择,这里为之后添加环境变量作为范例) 安装好后选 ...
- 简易版AI英文问答程序解决
第四章的作业和实践题要论印象深刻无疑就是AI的那道题了.不得不说一开始看到题目的时候,我真的蒙了很久. 本题要求你实现一个简易版的 AI 英文问答程序,规则是: 1.无论用户说什么,首先把对方说的话在 ...