luogu3369 【模板】普通平衡树(Treap/SBT) treap splay
treap做法,参考hzwer的博客
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int n, opt, uu, rot, cnt, ans;
struct Treap{
int siz[100005], hav[100005], val[100005], rnd[100005], l[100005], r[100005];
void upd(int x){
siz[x] = siz[l[x]] + siz[r[x]] + hav[x];
}
void lRotate(int &k){
int t=r[k]; r[k] = l[t]; l[t] = k;
siz[t] = siz[k]; upd(k); k = t;
}
void rRotate(int &k){
int t=l[k]; l[k] = r[t]; r[t] = k;
siz[t] = siz[k]; upd(k); k = t;
}
void insert(int &k, int x){
if(!k){
k = ++cnt; siz[k] = hav[k] = 1;
val[k] = x; rnd[k] = rand();
return ;
}
siz[k]++;
if(val[k]==x) hav[k]++;
else if(val[k]<x){
insert(r[k], x);
if(rnd[r[k]]<rnd[k]) lRotate(k);
}
else{
insert(l[k], x);
if(rnd[l[k]]<rnd[k]) rRotate(k);
}
}
void shanchu(int &k, int x){
if(!k) return ;
if(val[k]==x){
if(hav[k]>1){
hav[k]--; siz[k]--;
return ;
}
else if(l[k]*r[k]==0) k = l[k] + r[k];
else if(rnd[l[k]]>rnd[r[k]])
lRotate(k), shanchu(k, x);
else
rRotate(k), shanchu(k, x);
}
else if(val[k]<x) siz[k]--, shanchu(r[k], x);
else siz[k]--, shanchu(l[k], x);
}
int queryRank(int k, int x){
if(x<val[k]) return queryRank(l[k], x);
else if(x>val[k]) return queryRank(r[k], x)+siz[l[k]]+hav[k];
else return siz[l[k]]+1;
}
int queryNum(int k, int x){
if(x<=siz[l[k]]) return queryNum(l[k], x);
else if(x>siz[l[k]]+hav[k]) return queryNum(r[k], x-siz[l[k]]-hav[k]);
else return val[k];
}
void queryPre(int k, int x){
if(!k) return ;
if(val[k]<x) ans = k, queryPre(r[k], x);
else queryPre(l[k], x);
}
void queryNxt(int k, int x){
if(!k) return ;
if(val[k]>x) ans = k, queryNxt(l[k], x);
else queryNxt(r[k], x);
}
}treap;
int main(){
cin>>n;
while(n--){
scanf("%d %d", &opt, &uu);
switch(opt){
case 1: treap.insert(rot, uu); break;
case 2: treap.shanchu(rot, uu); break;
case 3: printf("%d\n", treap.queryRank(rot, uu)); break;
case 4: printf("%d\n", treap.queryNum(rot, uu)); break;
case 5: treap.queryPre(rot, uu); printf("%d\n", treap.val[ans]); break;
case 6: treap.queryNxt(rot, uu); printf("%d\n", treap.val[ans]); break;
}
}
return 0;
}
splay做法,参照zyf2000,但是一般我们用splay都是维护区间的
#include <iostream>
#include <cstdio>
using namespace std;
int n, uu, vv, rot=0, sze=0;
struct Splay{
int s[100005][2], f[100005], siz[100005], cnt[100005], val[100005];
inline void clr(int x){
s[x][0] = s[x][1] = f[x] = siz[x] = cnt[x] = val[x] = 0;
}
inline void upd(int x){
siz[x] = siz[s[x][0]] + siz[s[x][1]] + cnt[x];
}
inline int gx(int x){
return s[f[x]][1]==x;
}
void rotate(int x){
int old=f[x], oldf=f[old], w=gx(x);
s[old][w] = s[x][w^1]; s[x][w^1] = old;
f[s[old][w]] = old; f[old] = x; f[x] = oldf;
if(oldf) s[oldf][s[oldf][1]==old] = x;
upd(x); upd(old);
}
void splay(int x){
int fa=1;
while(fa){
fa = f[x];
if(!fa) break;
if(f[fa])rotate((gx(x)==gx(fa))?fa:x);
rotate(x);
}
rot = x;
}
void ins(int x){
if(!rot){
rot = ++sze; clr(rot);
siz[rot] = cnt[rot] = 1; val[rot] = x;
return ;
}
int now=rot, fa=0;
while(now){
if(val[now]==x){
cnt[now]++; upd(now);
upd(f[now]); splay(now); return ;
}
fa = now; now = s[now][val[now]<x];
if(!now){
now = ++sze; clr(now); val[now] = x; cnt[now] = siz[now] = 1;
f[now] = fa; s[fa][val[fa]<x] = now; upd(fa); splay(sze);
break;
}
}
}
int getRank(int x){
int now=rot, ans=0;
while(now){
if(x<val[now]) now = s[now][0];
else{
ans += siz[s[now][0]];
if(val[now]==x){
splay(now);
return ans+1;
}
ans += cnt[now];
now = s[now][1];
}
}
}
int getNum(int x){
int now=rot;
while(now){
if(x<=siz[s[now][0]]) now = s[now][0];
else{
int temp=siz[s[now][0]]+cnt[now];
if(x<=temp) return val[now];
x -= temp; now = s[now][1];
}
}
}
int getPre(){
int now=s[rot][0];
while(s[now][1]) now = s[now][1];
return now;
}
int getNxt(){
int now=s[rot][1];
while(s[now][0]) now = s[now][0];
return now;
}
void del(int x){
getRank(x);
if(cnt[rot]>1){
cnt[rot]--; upd(rot);
return ;
}
if(!s[rot][0] && !s[rot][1]){
clr(rot); rot = sze = 0;
return ;
}
if(!s[rot][0]){
int oldr=rot; rot = s[rot][1]; f[rot] = 0; clr(oldr);
return ;
}
if(!s[rot][1]){
int oldr=rot; rot = s[rot][0]; f[rot] = 0; clr(oldr);
return ;
}
int leftBig=getPre(), oldr=rot;
splay(leftBig); s[rot][1] = s[oldr][1];
f[s[rot][1]] = rot; clr(oldr); upd(rot);
}
}splay;
int main(){
cin>>n;
while(n--){
scanf("%d %d", &uu, &vv);
switch(uu){
case 1: splay.ins(vv); break;
case 2: splay.del(vv); break;
case 3: printf("%d\n", splay.getRank(vv)); break;
case 4: printf("%d\n", splay.getNum(vv)); break;
case 5: splay.ins(vv); printf("%d\n", splay.val[splay.getPre()]); splay.del(vv); break;
case 6: splay.ins(vv); printf("%d\n", splay.val[splay.getNxt()]); splay.del(vv); break;
}
}
return 0;
}
luogu3369 【模板】普通平衡树(Treap/SBT) treap splay的更多相关文章
- 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...
- 洛谷P3369 【模板】普通平衡树(Treap/SBT)
洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...
- [luogu P3369]【模板】普通平衡树(Treap/SBT)
[luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...
- AC日记——【模板】普通平衡树(Treap/SBT) 洛谷 P3369
[模板]普通平衡树(Treap/SBT) 思路: 劳资敲了一个多星期: 劳资终于a了: 劳资一直不a是因为一个小错误: 劳资最后看的模板: 劳资现在很愤怒: 劳资不想谈思路!!! 来,上代码: #in ...
- luoguP3369[模板]普通平衡树(Treap/SBT) 题解
链接一下题目:luoguP3369[模板]普通平衡树(Treap/SBT) 平衡树解析 #include<iostream> #include<cstdlib> #includ ...
- 替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 闲的没事,把各种平衡树都写写 比较比较... 下面是替罪羊树 #include <cstdio> #inc ...
- 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 近几天闲来无事...就把各种平衡树都写了一下... 下面是红黑树(Red Black Tree) 喜闻乐见拿到了luo ...
- tyvj 普通平衡树 SBT or splay
普通平衡树 From admin 背景 Background 此为平衡树系列第一道:普通平衡树 描述 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中 ...
- [BZOJ3223]文艺平衡树 无旋Treap
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...
- luoguP3391[模板]文艺平衡树(Splay) 题解
链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...
随机推荐
- Android 下的 SQLite 操作封装 —— DatabaseUtil
看到别人写的代码不错,对自己目前的开发很有用,所以转载一下,希望也能帮助到其他人: 1.DatabaseUtil.java(封装的类) package com.dbexample; import an ...
- 13.JAVA-包package、import使用
1.包的定义 之前我们学习java时,生成的class文件都是位于当前目录中,假如出现了同名文件,则会出现文件覆盖问题,因此就需要设置不同的目录(定义包),来解决同名文件冲突问题. 并且在大型项目中, ...
- Servlet中文件上传的几种方式
上传文件,因为上传的都是二进制数据,所以在Servlet中就不能直接用request.getParameter();方法进行数据的获取,需要借助第三方jar包对上传的二进制文件进行解析.常用的方式如下 ...
- 使用ABAP代码返回S/4HANA Material上维护的Attachment明细
在事务码 MM02里为ID为16的material维护附件: 如何使用ABAP代码获得如下附件的名称和文件内容? REPORT zgos_api. DATA ls_appl_object TY ...
- Ubuntu下编译C++ OpenCV程序并运行
因为想试跑yolov3的缘故,所以装了ubuntu系统,直接通过U盘装的,并不像他们说的“折腾”,反而一切非常顺利,比装软件还简单.然后就是要用C++跑opencv的程序用于比赛,出于 ...
- QQ 发送邮件
之前也发布过一篇QQ发邮件的,后来那种方法在阿里云服务器中报错了,查了好久才发现,是阿里云的服务器把 25 端口 给封杀了.现在重新做了个功能. public static string UserNa ...
- kvm笔记
1 virt-manager安装虚拟机无法使用键盘解决 今天远程用VNC登录服务器安装虚拟机,结果使用virt-manager安装虚拟机后在初始阶段无法使用键盘设置,这不雪崩了,后来来回试,找到了原因 ...
- 酷炫的3D照片墙
今天给大家分享的案例是酷炫的3D照片墙 这个案例主要是通过 CSS3 和原生的 JS 来实现的,接下来我给大家分享一下这个效果实现的过程.博客上不知道怎么放本地视频,所以只能放两张效果截图了. 1.实 ...
- noip考前注意事项
明天就要离开学校,后天的现在Day1已经考完啦,临近考试了紧不紧张呢(不紧张才怪),那么考前我们应该注意点什么呢? 1.带好自己的证件,带好自己的证件,带好自己的证件,这很重要. 2.试机的时候一定要 ...
- k8s资源指标API及metrics-server资源监控
简述: 在k8s早期版本中,对资源的监控使用的是heapster的资源监控工具. 但是从 Kubernetes 1.8 开始,Kubernetes 通过 Metrics API 获取资源使用指标,例如 ...