【数据结构】【平衡树】treap
之前写treap的传送门
之前写的那个太毒瘤了,这次放一个更毒瘤的指针版上来
#include<cstdio>
#include<iostream>
#define rg register
#define ci const int
#define cl const long long
typedef long long int ll;
typedef unsigned int uit;
template <typename T>
inline void qr(T &x) {
rg char ch=getchar(),lst=' ';
while((ch > '9') || (ch < '0')) lst=ch,ch=getchar();
while((ch >= '0') && (ch <= '9')) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
if(lst == '-') x=-x;
}
namespace IO {
char buf[120];
}
template <typename T>
inline void qw(T x,const char aft,const bool pt) {
if(x < 0) {x=-x,putchar('-');}
rg int top=0;
do {IO::buf[++top]=x%10+'0';} while(x/=10);
while(top) putchar(IO::buf[top--]);
if(pt) putchar(aft);
}
template <typename T>
inline T mmax(const T a,const T b) {return a > b ? a : b;}
template <typename T>
inline T mmin(const T a,const T b) {return a < b ? a : b;}
template <typename T>
inline T mabs(const T a) {return a < 0 ? -a : a;}
template <typename T>
inline void mswap(T &_a,T &_b) {
T _temp=_a;_a=_b;_b=_temp;
}
const int maxn = 100010;
const int INF = 20000000;
inline uit GetRandom(uit &x) {
x^=x<<5;
x^=x>>7;
x^=x<<17;
return x;
}
struct Treap {
Treap *ls,*rs,*fa;
int v,sz,sm,key;
Treap() {ls=rs=fa=NULL;key=v=sz=sm=0;}
inline int GetRelation(ci _v) {
if(this->v == _v) return 0;
else if(this->v > _v) return -1;
else return 1;
}
inline void ChangeV(ci _v) {
this->sm+=_v;this->sz+=_v;
}
inline bool NeedTurn(Treap *_son) {
return this->key > _son->key;
}
inline void update() {
this->sz=this->sm;//printf("QwQ%d ",this->sz);
if(this->ls) this->sz+=this->ls->sz;//printf("(%d %d)",this->ls->v,this->ls->sz);
if(this->rs) this->sz+=this->rs->sz;
// printf("(%d %d)\n",this->v,this->sz);
}
inline bool IsLeftSon() {
return this->fa->ls == this;
}
inline void RTurn() {
Treap *newrt=this->ls;
this->ls=newrt->rs;
if(this->ls) this->ls->fa=this;
if(this->IsLeftSon()) this->fa->ls=newrt;
else this->fa->rs=newrt;
newrt->fa=this->fa;
this->fa=newrt;
newrt->rs=this;
this->update();newrt->update();
}
inline void LTurn() {
Treap *newrt=this->rs;
this->rs=newrt->ls;
if(this->rs) this->rs->fa=this;
if(this->IsLeftSon()) this->fa->ls=newrt;
else this->fa->rs=newrt;
newrt->fa=this->fa;
this->fa=newrt;
newrt->ls=this;
this->update();newrt->update();
}
void dltit() {
this->key=INF;
while((this->ls) || (this->rs)) {
if(this->ls) {
if(this->rs) {
if(this->ls->key < this->rs->key) this->RTurn();
else this->LTurn();
}
else this->RTurn();
}
else this->LTurn();
}
for(Treap *i=this->fa;i->fa;i=i->fa) {
i->update();
}
if(this->IsLeftSon()) this->fa->ls=NULL;
else this->fa->rs=NULL;
*this=Treap();
}
};
Treap *pool[maxn],*rot,qwq[maxn];
int top;
int n;
uit sed=19620718;
void buildroot();
void buildpool();
void add(Treap*,ci);
void dlt(Treap*,ci);
int askrnk(Treap*,ci);
int asknum(Treap*,ci);
int askpre(Treap*,ci);
int askpro(Treap*,ci);
void LinkNew(Treap*,ci,ci);
int main() {
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
qr(n);
buildpool();
buildroot();
int a,b;
while(n--) {
a=b=0;qr(a);qr(b);
if(a == 1) add(rot,b);
else if(a == 2) dlt(rot,b);
else if(a == 3) qw(askrnk(rot,b),'\n',true);
else if(a == 4) qw(asknum(rot,b),'\n',true);
else if(a == 5) qw(askpre(rot,b),'\n',true);
else if(a == 6) qw(askpro(rot,b),'\n',true);
}
return 0;
}
void buildpool() {
for(rg int i=0;i<maxn;++i) pool[i]=qwq+i;
top=maxn-1;
}
void buildroot() {
rot=pool[top--];
rot->key=-INF;rot->v=INF;rot->sz=rot->sm=1;
}
void LinkNew(Treap *u,ci tp,ci v) {
Treap *newp=pool[top--];
newp->fa=u;newp->v=v;newp->key=mabs(int(GetRandom(sed)));
newp->sz=newp->sm=1;
if(tp < 0) u->ls=newp;
else u->rs=newp;
}
void add(Treap* u,ci v) {
int k=u->GetRelation(v);
if(!k) {u->ChangeV(1);return;}
else if(k < 0) {
if(u->ls != NULL) add(u->ls,v);
else LinkNew(u,-1,v);
if(u->NeedTurn(u->ls)) u->RTurn();
}
else {
if(u->rs != NULL) add(u->rs,v);
else LinkNew(u,1,v);
if(u->NeedTurn(u->rs)) u->LTurn();
}
u->update();
}
void dlt(Treap *u,ci v) {
int k=u->GetRelation(v);
if(!k) {
u->ChangeV(-1);
if(!(u->sm)) {u->dltit();pool[++top]=u;}
return;
}
else if(k < 0) dlt(u->ls,v);
else dlt(u->rs,v);
u->update();
}
int askrnk(Treap *u,ci v) {
int k=u->GetRelation(v);
if(!k) {
if(u->ls) return u->ls->sz+1;
else return 1;
}
else if(k < 0) return askrnk(u->ls,v);
else {
if(u->ls) return askrnk(u->rs,v)+u->sm+u->ls->sz;
else return askrnk(u->rs,v)+u->sm;
}
}
int asknum(Treap *u,ci v) {
int s=u->sm;
if(u->ls) {
int k=u->ls->sz;
if(k >= v) return asknum(u->ls,v);
s+=u->ls->sz;
}
if(s >= v) return u->v;
else return asknum(u->rs,v-s);
}
int askpre(Treap *u,ci v) {
if(u->v < v) {
if(u->rs) return mmax(askpre(u->rs,v),u->v);
else return u->v;
}
if(u->ls) return askpre(u->ls,v);
return -INF;
}
int askpro(Treap *u,ci v) {
if(u->v > v) {
if(u->ls) return mmin(askpro(u->ls,v),u->v);
else return u->v;
}
if(u->rs) return askpro(u->rs,v);
return INF;
}
【数据结构】【平衡树】treap的更多相关文章
- hiho #1325 : 平衡树·Treap
#1325 : 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? ...
- hiho一下103周 平衡树·Treap
平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二 ...
- Hihocoder 1325 平衡树·Treap(平衡树,Treap)
Hihocoder 1325 平衡树·Treap(平衡树,Treap) Description 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二叉 ...
- HihoCoder 1325 平衡树·Treap
HihoCoder 1325 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说 ...
- 普通平衡树Treap(含旋转)学习笔记
浅谈普通平衡树Treap 平衡树,Treap=Tree+heap这是一个很形象的东西 我们要维护一棵树,它满足堆的性质和二叉查找树的性质(BST),这样的二叉树我们叫做平衡树 并且平衡树它的结构是接近 ...
- HihoCoder1325 : 平衡树·Treap(附STL版本)
平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二 ...
- 算法模板——平衡树Treap 2
实现功能:同平衡树Treap 1(BZOJ3224 / tyvj1728) 这次的模板有了不少的改进,显然更加美观了,几乎每个部分都有了不少简化,尤其是删除部分,这个参照了hzwer神犇的写法,在此鸣 ...
- 【山东省选2008】郁闷的小J 平衡树Treap
小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的.具体说来,书架由N ...
- luoguP3369[模板]普通平衡树(Treap/SBT) 题解
链接一下题目:luoguP3369[模板]普通平衡树(Treap/SBT) 平衡树解析 #include<iostream> #include<cstdlib> #includ ...
- 2021.12.06 平衡树——Treap
2021.12.06 平衡树--Treap https://www.luogu.com.cn/blog/HOJQVFNA/qian-xi-treap-ping-heng-shu 1.二叉搜索树 1.1 ...
随机推荐
- Linux工作管理
工作管理? 其实也就是把程序放到后台来管理,在windows中也就是最小化,在Linux中是通过命令把程序放到后台中.jobs命令查看后台程序. 对于第一点注意事项,mysql启动是例外的,要是叉掉了 ...
- SQL Server变量杂谈
学习SQL的过程有进步的话还是一件很美妙的事情的 在第一家公司虽然只呆了两年,但是感觉是我进步最快的两年.那时候工作和生活都挺充实的,每天都有一点点的收获和付出,其中最大的收获莫过于掌握一些核心技能. ...
- Paper Reading - Convolutional Sequence to Sequence Learning ( CoRR 2017 ) ★
Link of the Paper: https://arxiv.org/abs/1705.03122 Motivation: Compared to recurrent layers, convol ...
- Appstate的几种状态及在android 和ios触发
AppState能告诉你当前应用是在前台还是在后台,或者处于切换应用的状态,并且能在状态变化的时候通知你. AppState 通常在处理推送通知的时候用来决定内容和对应的行为 一: App State ...
- rest_framework组件
认证组件 局部认证 在需要认证的视图类里加上authentication_classes = [认证组件1类名,认证组件2类名....] 示例如下: seralizers.py from rest_f ...
- 大前端全栈CSS3移动端开发
作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主.有不正确的地方,欢迎批评指正 本节课学习视频来源:https://ww ...
- js操作对象属性值为字符串
今天在项目开发中遇到一个没遇到过的问题,这个问题是需要对比两个对象a和b,a是一个只有一个属性的对象,b是一个含有多个属性对象,如果b中包含和a一模一样的属性名和值,则把这个一样的属性和值从b中删除了 ...
- php异步学习(2)
PHP开启异步多线程执行脚本 场景要求 客户端调用服务器a.php接口,需要执行一个长达5s-20s不等的耗资源操作,但是客户端响应请求时间为5秒(微信公众账号服务器请求响应超时时间),5s以上无 ...
- USACO 1.2.2 Transformations 方块转换
Description 一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案.写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式: 1:转90度 ...
- HDU 5861 Road 线段树区间更新单点查询
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5861 Road Time Limit: 12000/6000 MS (Java/Othe ...