平衡树之treap luoguP3369
今天又复习了一遍treap,这题有前驱后继排名排位添加和删除等操作。
非常好写,虽然代码颇长但逻辑性很强。
#include<bits/stdc++.h>
using namespace std;
const int N=;
struct node
{
int l,r,w,v,size,heap;
}t[N];
int n,rt,cnt;
void merge(int p)
{
t[p].size=t[t[p].l].size+t[t[p].r].size+t[p].w;
}
void rturn(int &p)
{
int ls=t[p].l;
t[p].l=t[ls].r;
t[ls].r=p;
t[ls].size=t[p].size;
merge(p);
p=ls;
}
void lturn(int &p)
{
int rs=t[p].r;
t[p].r=t[rs].l;
t[rs].l=p;
t[rs].size=t[p].size;
merge(p);
p=rs;
}
void insert(int &k,int x)
{
if(!k)
{
cnt++;
k=cnt;
t[k].w=t[k].size=;
t[k].v=x;
t[k].heap=rand();
return;
}
t[k].size++;
if(t[k].v==x)
t[k].w++;
else
{
if(t[k].v<x)
{
insert(t[k].r,x);
if(t[t[k].r].heap>t[k].heap)
lturn(k);
}
if(t[k].v>x)
{
insert(t[k].l,x);
if(t[t[k].l].heap>t[k].heap)
rturn(k);
}
}
}
int tmp;
void querypre(int k,int x)
{
if(!k)return;
if(x>t[k].v)
{
tmp=t[k].v;querypre(t[k].r,x);
}
else querypre(t[k].l,x);
}
void querylas(int k,int x)
{
if(!k)return;
if(x<t[k].v)
{
tmp=t[k].v;querylas(t[k].l,x);
}
else querylas(t[k].r,x);
}
void del(int &k,int x)
{
if(!k)return;
if(t[k].v==x)
{
if(t[k].w>)
{
t[k].w--;t[k].size--;
}
else if(!t[k].l||!t[k].r)k=t[k].l+t[k].r;
else
{
if(t[t[k].l].heap>t[t[k].r].heap)
{
rturn(k);
del(k,x);
}
else
{
lturn(k);
del(k,x);
}
}
}
else
{
t[k].size--;
if(x>t[k].v)
del(t[k].r,x);
else
del(t[k].l,x);
}
}
int queryrank(int k,int x)
{
if(k==)return ;
if(t[k].v==x)
return t[t[k].l].size+;
else
{
if(x>t[k].v)return t[t[k].l].size+t[k].w+queryrank(t[k].r,x);
else return queryrank(t[k].l,x);
}
}
int querysum(int k,int x)
{
if(k==)return ;
if(x<=t[t[k].l].size)return querysum(t[k].l,x);
else
{
if(x>t[t[k].l].size+t[k].w)return querysum(t[k].r,x-t[t[k].l].size-t[k].w);
else return t[k].v;
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;++i)
{
int f,x;
scanf("%d%d",&f,&x);
if(f==)insert(rt,x);
else if(f==)del(rt,x);
else if(f==)printf("%d\n",queryrank(rt,x));
else if(f==)printf("%d\n",querysum(rt,x));
else if(f==){
querypre(rt,x);printf("%d\n",tmp);
}
else{
querylas(rt,x);printf("%d\n",tmp);
}
}
return ;
}
平衡树之treap luoguP3369的更多相关文章
- 初涉平衡树「treap」
treap:一种平衡的二叉搜索树 什么是treap(带旋) treap=tree+heap,这大家都知道.因为二叉搜索树(BST)非常容易被卡成一条链而影响效率,所以我们需要一种更加平衡的树形结构,从 ...
- Hihocoder 1325 平衡树·Treap(平衡树,Treap)
Hihocoder 1325 平衡树·Treap(平衡树,Treap) Description 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二叉 ...
- 洛谷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 ...
- 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...
- 替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 闲的没事,把各种平衡树都写写 比较比较... 下面是替罪羊树 #include <cstdio> #inc ...
- 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 近几天闲来无事...就把各种平衡树都写了一下... 下面是红黑树(Red Black Tree) 喜闻乐见拿到了luo ...
- 2021.12.08 平衡树——FHQ Treap
2021.12.08 平衡树--FHQ Treap http://www.yhzq-blog.cc/fhqtreapzongjie/ https://www.cnblogs.com/zwfymqz/p ...
随机推荐
- 【BZOJ】1711: [Usaco2007 Open]Dining吃饭
[算法]最大流 [题解] S连向食物连向牛连向牛‘连向饮料连向T. 经典的一个元素依赖于两个元素的建图方式. #include<cstdio> #include<algorithm& ...
- python学习笔记(十)之格式化字符串
格式化字符串,可以使用format方法.format方法有两种形式参数,一种是位置参数,一种是关键字参数. >>> '{0} {1}'.format('Hello', 'Python ...
- Spring boot中使用log4j记录日志
之前在Spring Boot日志管理一文中主要介绍了Spring Boot中默认日志工具(logback)的基本配置内容.对于很多习惯使用log4j的开发者,Spring Boot依然可以很好的支持, ...
- 利用Addon Domain和A记录使两个域名同时指向同一个网站
今天碰到这样的需求:已有网站A.com, 以及新注册的域名B.net, 现需要将B.net指向与A.com相同的内容. 这里提出的方法是在空间后台添加Addon domain, 以及在域名B.net后 ...
- 安装 Google BBR 加速VPS网络
Google BBR就是谷歌公司提出的一个开源TCP拥塞控制的算法.详情可以看这儿:https://lwn.net/Articles/701165.https://blog.sometimesnaiv ...
- python自动开发之(算法)第二十七天
1.什么是算法? 算法(Algorithm):一个计算过程,解决问题的方法 2.复习:递归 递归的两个特点:(1) 调用自身 (2)结束条件 def func1(x): print(x) func1( ...
- SVM问题再理解与分析——我的角度
SVM问题再理解与分析--我的角度 欢迎关注我的博客:http://www.cnblogs.com/xujianqing/ 支持向量机问题 问题先按照几何间隔最大化的原则引出他的问题为 上面的约束条件 ...
- juery下拉刷新,div加载更多元素并添加点击事件(二)
buffer.append("<div class='col-xs-3 "+companyId+"' style='padding-left: 10px; padd ...
- curl基于URL的文件传输工具
简介 cURL是一款开源的基于URL的文件传输工具,支持HTTP.HTTPS.FTP等协议,支持POST.cookie.认证.扩展头部.限速等特性. curl命令用途广泛,比如下载.发送http请求. ...
- NLP基础 成分句法分析和依存句法分析
正则匹配: .除换行符所有的 ?表示0次或者1次 *表示0次或者n次 a(bc)+表示bc至少出现1次 ^x.*g$表示字符串以x开头,g结束 |或者 http://regexr.com/ 依存句法分 ...