洛谷P3369 【模板】普通平衡树(FHQ Treap)
题面
题解
写了一下\(FHQ\ Treap\)
//minamoto
#include<bits/stdc++.h>
#define R register
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
    R int res,f=1;R char ch;
    while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
    for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
    return res*f;
}
char sr[1<<21],z[20];int K=-1,Z=0;
inline void Ot(){fwrite(sr,1,K+1,stdout),K=-1;}
void print(R int x){
    if(K>1<<20)Ot();if(x<0)sr[++K]='-',x=-x;
    while(z[++Z]=x%10+48,x/=10);
    while(sr[++K]=z[Z],--Z);sr[++K]='\n';
}
unsigned int aaa=19260817;
inline unsigned int rd(){aaa^=aaa>>15,aaa+=aaa<<12,aaa^=aaa>>3;return aaa;}
const int N=1e5+5;
struct node;typedef node* ptr;
struct node{
	ptr lc,rc;int v,sz;unsigned int pr;
	inline node();
	inline void init(R int val){v=val,pr=rd(),sz=1;}
	inline ptr upd(){return sz=lc->sz+rc->sz+1,this;}
}e[N],*rt=e;int tot;
inline node::node(){lc=rc=e;}
inline ptr newnode(R int v){return e[++tot].init(v),e+tot;}
void split(ptr p,int k,ptr &s,ptr &t){
	if(p==e)return s=t=e,void();
	if(p->v<=k)s=p,split(p->rc,k,p->rc,t);
		else t=p,split(p->lc,k,s,p->lc);
	p->upd();
}
ptr merge(ptr s,ptr t){
	if(s==e)return t;if(t==e)return s;
	if(s->pr<t->pr)return s->rc=merge(s->rc,t),s->upd();
	return t->lc=merge(s,t->lc),t->upd();
}
void insert(int k){
	ptr s,t;
	split(rt,k,s,t);
	rt=merge(merge(s,newnode(k)),t);
}
void erase(int k){
	ptr s,t,p;
	split(rt,k,s,t),split(s,k-1,s,p),p=merge(p->lc,p->rc);
	rt=merge(merge(s,p),t);
}
int rk(int k){
	ptr s,t;int now;
	split(rt,k-1,s,t);now=s->sz+1;
	return rt=merge(s,t),now;
}
int Kth(ptr p,int k){
	if(p->lc->sz==k-1)return p->v;
	if(p->lc->sz>=k)return Kth(p->lc,k);
	return Kth(p->rc,k-p->lc->sz-1);
}
int Pre(int k){
	ptr s,t;int now;
	split(rt,k-1,s,t),now=Kth(s,s->sz);
	return rt=merge(s,t),now;
}
int nxt(int k){
	ptr s,t;int now;
	split(rt,k,s,t),now=Kth(t,1);
	return rt=merge(s,t),now;
}
int main(){
//	freopen("testdata.in","r",stdin);
	int q=read(),op,x;
	while(q--){
		op=read(),x=read();
		switch(op){
			case 1:insert(x);break;
			case 2:erase(x);break;
			case 3:print(rk(x));break;
			case 4:print(Kth(rt,x));break;
			case 5:print(Pre(x));break;
			case 6:print(nxt(x));break;
		}
	}
	return Ot(),0;
}
												
											洛谷P3369 【模板】普通平衡树(FHQ Treap)的更多相关文章
- 洛谷.3369.[模板]普通平衡树(fhq Treap)
		
题目链接 第一次(2017.12.24): #include<cstdio> #include<cctype> #include<algorithm> //#def ...
 - 【洛谷P3369】普通平衡树——Splay学习笔记(一)
		
二叉搜索树(二叉排序树) 概念:一棵树,若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉搜索树 ...
 - 洛谷.3369.[模板]普通平衡树(Splay)
		
题目链接 第一次写(2017.11.7): #include<cstdio> #include<cctype> using namespace std; const int N ...
 - 洛谷.3391.[模板]文艺平衡树(Splay)
		
题目链接 //注意建树 #include<cstdio> #include<algorithm> const int N=1e5+5; //using std::swap; i ...
 - 洛谷P3369 【模板】普通平衡树(Treap/SBT)
		
洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...
 - 【洛谷P3369】【模板】普通平衡树题解
		
[洛谷P3369][模板]普通平衡树题解 题目链接 题意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3 ...
 - 洛谷P3369普通平衡树(Treap)
		
题目传送门 转载自https://www.cnblogs.com/fengzhiyuan/articles/7994428.html,转载请注明出处 Treap 简介 Treap 是一种二叉查找树.它 ...
 - 2021.12.08 平衡树——FHQ Treap
		
2021.12.08 平衡树--FHQ Treap http://www.yhzq-blog.cc/fhqtreapzongjie/ https://www.cnblogs.com/zwfymqz/p ...
 - 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
		
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
 
随机推荐
- centos7.5安装java JDK、tomcat、mysql
			
参考资料: https://www.cnblogs.com/sxdcgaq8080/p/7492426.html https://blog.csdn.net/ds986619036/article/d ...
 - Windows&Mac安装Redis
			
Windows&Mac安装Redis Window 下安装Redis Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择,这里我下载 Redis-x64-xxx.zi ...
 - Java中调用存储过程
			
dao层: import java.util.Map; public interface AppGthdDao { public String gthd(Map map); } mapper层 < ...
 - maven基本知识的7个提问
			
在如今的互联网项目开发当中,特别是Java领域,Maven的仓库管理.依赖管理.继承和聚合等特性为项目的构建提供了一整套完善的解决方案. 这里我们通过7个关于Maven的提问来了解Maven的一些基本 ...
 - Android开发中网络代理设置实用总结
			
一.背景 进行Android项目开发时,跟网络代理基本上天天都在打交道.通常情况下,至少有三个场景中经常用到网络代理: 1,经常通过Chrome访问Google等国外的技术网站,如通过SS工具等: 2 ...
 - python__系统 : 线程池
			
参考文档: https://www.jianshu.com/p/b9b3d66aa0be 使用 ThreadPoolExecutor 类, as_completed 是迭代器, 如果有任务执行完 ...
 - 最简单的 kubernetes 高可用安装方式
			
sealos 项目地址:https://github.com/fanux/sealos 本文教你如何用一条命令构建 k8s 高可用集群且不依赖 haproxy 和 keepalived,也无需 ans ...
 - 『kamp 树形dp』
			
kamp Description jz 市的云台山是个很美丽的景区,小 x 暑期到云台山打工,他的任务是开景区的大巴. 云台山景区有 N 个景点,这 N 个景点由 N-1 条道路连接而成,我们保证这 ...
 - mybatis分页的一种解决方案
			
mybatis自定义分页解决方案 1.PageSqlProvider<T> —— 提供默认的分页列表查询 package com.xinyartech.erp.core.base; im ...
 - java获取调用当前方法的方法名和行数
			
java获取调用当前方法的方法名和行数String className = Thread.currentThread().getStackTrace()[2].getClassName();//调用的 ...