平衡树之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 ...
随机推荐
- Eclipse 断点调试
Eclipse 开发专用的Debug模式,用于发现问题解决问题. 1. 设置断点,程序会在改位置停止. 2. 按F5(step into), F6(step over)执行.F5指跳入,逐语句.会进入 ...
- Oozie与Coordinator调度讲解及系统时区配置与定时触发两种配置方式
1:修改本地linux时区 查看时区 - 号代表西 + 号 代表东 北京时间是东八区 设置时区的配置文件所在位置 cd /usr/share/zoneinfo/ 选择以亚洲的上海 的时区为基址 删除 ...
- ue4 TimeRemaining(ratio)找不到的问题
最近看ue4的Blueprint 3rd Person Game的教学视频,其中第十集https://docs.unrealengine.com/latest/INT/Videos/PLZlv_N0_ ...
- 吐泡泡(2018年全国多校算法寒假训练营练习比赛(第二场)+栈模拟)+Plug-in(codeforces81A+栈模拟)
吐泡泡题目链接:https://www.nowcoder.com/acm/contest/74/A 题目: 思路: 这种题目当初卡了我很久,今天早训时遇到一个一样得题,一眼就想到用栈模拟,就又回来把这 ...
- POJ 3233 Matrix Power Series (矩阵快速幂)
题目链接 Description Given a n × n matrix A and a positive integer k, find the sum S = A + A^2 + A^3 + - ...
- NYOJ 305 表达式求值 (字符串处理)
题目链接 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练, ...
- windows7下安装配置phonegap3.0 (cordavo)开发环境 (涉及android sdk配置)
之前在mac上安装调试过phonegap,现在公司用的是windows7,所以不得不再进行一次windows下的配置工作,顺便也写下来了 主要麻烦的地方是要在win7下添加好几个环境变量,这一块地方特 ...
- C# 操作资源文件
(1)首先引用这两个命名空间 (2)两种方式调用资源文件中的内容 private void button2_Click(object sender, EventArgs e) { //通过Resour ...
- Web攻防系列教程之 Cookie注入攻防实战
摘要:随着网络安全技术的发展,SQL注入作为一种很流行的攻击方式被越来越多的人所知晓.很多网站也都对SQL注入做了防护,许多网站管理员的做法就是添加一个防注入程序.这时我们用常规的手段去探测网站的SQ ...
- Linux下文件目录权限和对应命令的总结
Linux下的权限有rwx三种,分别对应读,写,执行三种,在对文件和目录时,分别是下列含义: 对应权限的命令为: 文件: r-- cat, more, head, tail w-- echo, vi ...