平衡树之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 ...
随机推荐
- final关键字详解
java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字的基本用法. 1.修饰类 当用final修饰一个类时,表明这个类不能被继承 ...
- python初步学习-python函数 (二)
几个特殊的函数(待补充) python是支持多种范型的语言,可以进行所谓函数式编程,其突出体现在有这么几个函数: filter.map.reduce.lambda.yield lambda >& ...
- FastStoneCapture(FSCapture)录屏、剪辑教程
FastStoneCapture软件编辑视频的使用方法: http://www.tudou.com/programs/view/2eD-s5HP1xw/
- layui实现类似于bootstrap的模态框功能
以前习惯了bootstrap的模态框,突然换了layui,想的用layui实现类似于bootstrap的模态框功能. 用到了layui的layer模块,例如: <!DOCTYPE html> ...
- BZOJ 1975: [Sdoi2010]魔法猪学院——K短路,A*
传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1975 题意&简要做法 一张有向图,求出最多的互不相同的路径,满足路径长度之和\(\l ...
- falsk注册etcd
部署web服务集群时,我们希望能动态调整集群大小.当一个新的节点启动时,可以将自己的信息注册给master, 让master把它加入到集群里, 关闭之后也可以把自己从集群中删除.我这里使用的是flas ...
- Spring之IOC,DI,动态代理,反射
Spring框架是J2EE开发中一个使用广泛的框架,它使得dao和service层的维护更加便利.Spring框架有两个重要的特征,一个是IOC,另一个是AOP.我们在这里主要介绍IOC,以及IOC中 ...
- IDEA配置toString方法
1.toString JSON带父类toString public java.lang.String toString() { final java.lang.StringBuilder sb = n ...
- 20165301 2017-2018-2 《Java程序设计》第二周学习总结
20165301 2017-2018-2 <Java程序设计>第二周学习总结 教材学习内容总结 第二章:基本数据类型与数组 标识符 第一个字符不能是数字 不能是关键字 不能是true.fa ...
- asyncio的简单了解
asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持. asyncio的编程模型就是一个消息循环.我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要 ...