今天又复习了一遍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. [php]数组建立方式

    1.$a[0]=..; $a[1]=..; $a[2]=..; $a[3]=..; 2.$a=array(1,2,3,4,5); 3.自定义数组 $a['logo']="qq"; ...

  2. 51nod1056 最长等差数列 V2

    基准时间限制:8 秒 空间限制:131072 KB 分值: 1280  N个不同的正整数,从中选出一些数组成等差数列.   例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括 ...

  3. 【BZOJ】1297: [SCOI2009]迷路

    [题意]给定n个点的有向带边权图,求0到n-1长度恰好为T的路径数.n<=10,T<=10^9,边权1<=wi<=9. [算法]矩阵快速幂 [题解]这道题的边权全部为1时,有简 ...

  4. JQuery对RadioButton和CheckButton的操作

    js对RadioButton和CheckButton的操作,在网站开发中会经常遇到,而JQuery操作RadioButton和CheckButton非常便捷.小编觉得网站开发人员有必要熟练掌握.所以小 ...

  5. 5、Linux操作系统介绍

    1操作系统的作用·是现代计算机系统中最基本和最重要的系统软件·是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩展·主要作用是管理好硬件设备,并为用户和应用程序提供一个简单的接口,以便于使用·而其 ...

  6. 47、Python面向对象中的继承有什么特点?

    继承的优点: 1.建造系统中的类,避免重复操作. 2.新类经常是基于已经存在的类,这样就可以提升代码的复用程度. 继承的特点: 1.在继承中基类的构造(__init__()方法)不会被自动调用,它需要 ...

  7. TCP 传输控制协议(转)

    开头先说几个协议: IP:网际协议 TCP:传输控制协议 Http:超文本传输协议 AMQP:高级消息队列协议 一:TCP是什么? TCP(Transmission Control Protocol ...

  8. iOS中响应者链条-触摸事件,hitTest方法坐标转换

    总体来说,分2个步骤: 一,从上到下寻找合适的控件来处理这个触摸事件.如下图,如果点击了黄色4,则UIApplication -> UIWindow -> 1白色 -> 2橙色 -& ...

  9. Git和Github简单教程【转】

    转自:https://www.cnblogs.com/schaepher/p/5561193.html#clone 原文链接:Git和Github简单教程 网络上关于Git和GitHub的教程不少,但 ...

  10. Android 开发笔记(二)菜单设计

    菜单设计一 // 创建菜单 public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, 0, 0, "关于"); men ...