今天又复习了一遍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的更多相关文章

  1. 初涉平衡树「treap」

    treap:一种平衡的二叉搜索树 什么是treap(带旋) treap=tree+heap,这大家都知道.因为二叉搜索树(BST)非常容易被卡成一条链而影响效率,所以我们需要一种更加平衡的树形结构,从 ...

  2. Hihocoder 1325 平衡树·Treap(平衡树,Treap)

    Hihocoder 1325 平衡树·Treap(平衡树,Treap) Description 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二叉 ...

  3. 洛谷P3369 【模板】普通平衡树(Treap/SBT)

    洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...

  4. [luogu P3369]【模板】普通平衡树(Treap/SBT)

    [luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...

  5. AC日记——【模板】普通平衡树(Treap/SBT) 洛谷 P3369

    [模板]普通平衡树(Treap/SBT) 思路: 劳资敲了一个多星期: 劳资终于a了: 劳资一直不a是因为一个小错误: 劳资最后看的模板: 劳资现在很愤怒: 劳资不想谈思路!!! 来,上代码: #in ...

  6. 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...

  7. 替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 闲的没事,把各种平衡树都写写 比较比较... 下面是替罪羊树 #include <cstdio> #inc ...

  8. 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 近几天闲来无事...就把各种平衡树都写了一下... 下面是红黑树(Red Black Tree) 喜闻乐见拿到了luo ...

  9. 2021.12.08 平衡树——FHQ Treap

    2021.12.08 平衡树--FHQ Treap http://www.yhzq-blog.cc/fhqtreapzongjie/ https://www.cnblogs.com/zwfymqz/p ...

随机推荐

  1. SQL Server 高级SQL

    查询view 的列和列数据类型 SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'vi ...

  2. 【译】Linux提权基础

    英文原文: Basic Linux Privilege Escalation 在开始之前,我想指出 - 我不是专家. 据我所知,在这个巨大的领域没有一个“魔法”的答案. 这只是我的发现,写出来,共享而 ...

  3. Coursera在线学习---第二节.Octave学习

    1)两个矩阵相乘 A*B 2)两个矩阵元素位相乘(A.B矩阵中对应位置的元素相乘) A.*B 3)矩阵A的元素进行平方 A.^2 4)向量或矩阵中的元素求倒数 1./V    或   1./A 5) ...

  4. supervisor之启动rabbitmq报错原因

    前言 今天重启了服务器,发现supervisor管理的rabbitmq的进程居然启动失败了,查看日志发现老是报错,记录一下解决的办法. 报错:erlexec:HOME must be set 找了网上 ...

  5. 事务的特性——ACID

    在日常操作中,对于一组相关操作通常需要其全部成功或全部失败.在关系型数据库中,这组操作称作为事务.事务具有四种特性:原子性,一致性,隔离性和持久性. 原子性(atomicity):事务必须以一个整体单 ...

  6. C# 加密解密以及sha256不可逆加密案例

    class Program { static void Main(string[] args) { string aa = "身份证"; string bb = "key ...

  7. 关于DataTable.Select不到数据的一种解决方案

    网上有很多说的,试过,都没用.自己研究了一下,解决方案如下: 建立dataview,用dv.rowfilter,就可以取到了,然后TOTABLE即可. 代码如下:(只看中间那几句即可) private ...

  8. idea关于断点的补充

    黑背景版: 先编译好要调试的程序.1.设置断点

  9. sort排序命令常见用法

    sort -n 按数字排序 [root@test88 ~]# cat test.txt 19036 6111 24039 3660 20610 10937 32408 20744 8248 28255 ...

  10. C语言俄罗斯方块

    #include <windows.h> #include <stdio.h> #include <time.h> #include <conio.h> ...