模板题:D错因见注释

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int INF=0x7fffffff;
struct treap
{
treap* lson;
treap* rson;
int key;//该节点的值
int priority;//优先级
int size;//该节点以及其子树的大小
int cnt;//当前值的数字的个数
int lsize()//返回左子树的大小
{
if (lson==NULL) return ;
else return lson->size;
}
int rsize()//返回右子树的大小
{
if (rson==NULL) return ;
else return rson->size;
} treap()
{
size=cnt=;//这里初始值应该是1而不是0
priority =rand();//随机生成优先级
lson=rson=NULL;
}
};
treap* root=NULL;
int n; void update(treap* &rt)//【【Attention】】要写成*&
{
/*旋转后进行的操作更新size大小=cnt+左子树size+右子树size*/
rt->size=rt->cnt;
rt->size+=rt->lsize();
rt->size+=rt->rsize();
} void RightRotate(treap* &rt)
{
/*画图模拟一下:D*/
treap* tmp=rt->lson;
rt->lson=tmp->rson;
tmp->rson=rt;
update(rt);
update(tmp);
rt=tmp;
} void LeftRotate(treap* &rt)
{
treap* tmp=rt->rson;
rt->rson=tmp->lson;
tmp->lson=rt;
update(rt);
update(tmp);
rt=tmp;
} void insert(treap*&rt,int x)
{
/*
如果当前根节点是空的,那么新建一棵平衡树;
如果当前的x和根节点的数值大小一样,则直接在根节点累加个数;
如果当前x小于根节点的数值,那么向左子树搜索。回溯后如果左边的优先级大于根节点,则右旋
如果当前x小于根节点的数值,那么向右子树搜索。回溯后如果右边的优先级大于根节点,则左旋
*/
if (rt==NULL)
{
rt=new treap;
rt->key=x;
}
else if (x==rt->key)
{
rt->size++;
rt->cnt++;
}
else if (x<rt->key)
{
insert(rt->lson,x);
if (rt->lson->priority>rt->priority) RightRotate(rt);
update(rt);
}
else
{
insert(rt->rson,x);
if (rt->rson->priority>rt->priority) LeftRotate(rt);
update(rt);
}
} void del(treap* &rt,int x)
{
/*
如果当前根节点的key就是要删除的那个值
(1)如果当前数值的个数大于1个,直接减去cnt和size即可;
(2)如果左子树是空的,这将根节点保存给临时变量,根节点等于它的右子树,释放原来根节点内存;
(3)右子树为空同理;
(4)如果左右子树均不为空,比较两者的优先级。如果左子树优先级大则右旋,反之左旋。
如果当前根节点的key不是要删除的那个值
(1)如果x<key,则搜索左子树;
(2) 否则搜索右子树。
*/
if (x==rt->key)
{
if (rt->cnt>)
{
rt->cnt--;
rt->size--;
}
else if (rt->lson==NULL)
{
treap* tmp=rt;
rt=rt->rson;
delete tmp;
}
else if (rt->rson==NULL)
{
treap* tmp=rt;
rt=rt->lson;
delete tmp;
}
else
{
if (rt->lson->priority>rt->rson->priority)
{
RightRotate(rt);
del(rt->rson,x);
}
else
{
LeftRotate(rt);
del(rt->lson,x);
}
}
}
else
{
if (rt->key>x) del(rt->lson,x);
else del(rt->rson,x);
}
if (rt!=NULL) update(rt);
} int getrank(treap* &rt,int x)
{
/*
如果当前的key等于要询问的数,直接返回排名(左子树的大小+1)
如果当前的key大于要询问的数,进入左子树查询并返回排名
如果当前的key小于要询问的树,则返回的排名=(左子树大小+当前节点数的个数+它在右子树中的排名)
*/
if (rt->key==x) return (rt->lsize()+);
if (x<rt->key) return (getrank(rt->lson,x));
return (getrank(rt->rson,x)+rt->lsize()+rt->cnt);
} int getnum(treap* &rt,int x)
{
/*
如果需要询问的排名属于当前节点的范围(左子树个数+1~左子树个数+当前节点数的个数),则直接返回当前的key
如果要询问的排名在左子树,则前往左子树询问排名
如果要询问的排名在右子树,则前往右子树询问排名,且要询问的排名=排名-左子树的大小-当前节点代表的数的个数
*/
if (rt->lsize()+<=x && x<=rt->lsize()+rt->cnt) return rt->key;
if (x<=rt->lsize()) return getnum(rt->lson,x);
return getnum(rt->rson,x-rt->lsize()-rt->cnt);
} int pre(treap* &rt,int x)
/*
如果当前节点的值小于x,则取它和ans中较大的那个,并继续搜索右子树
如果当前节点的值大于等于x,则继续搜索左子树
*/
{
int ans=-INF;
treap* tmp=rt;
while (tmp)
{
if (tmp->key<x)
/*尴尬,这整个子程序的tmp->key都手残敲成了tmp->key...下次注意:D*/
{
ans=max(tmp->key,ans);
tmp=tmp->rson;
}
else tmp=tmp->lson;
}
return ans;
} int suc(treap* &rt,int x)
/*与pre类似*/
{
int ans=INF;
treap* tmp=rt;
while (tmp)
{
if (tmp->key>x)
{
ans=min(tmp->key,ans);
tmp=tmp->lson;
}
else tmp=tmp->rson;
}
return ans;
} void option()
{
int opt,x;
scanf("%d%d",&opt,&x);
if (opt==) insert(root,x);
else if (opt==) del(root,x);
else if (opt==) printf("%d\n",getrank(root,x));
else if (opt==) printf("%d\n",getnum(root,x));
else if (opt==) printf("%d\n",pre(root,x));
else if (opt==) printf("%d\n",suc(root,x));
} void release(treap* &rt)
{
if (rt->lson) release(rt->lson);
if (rt->rson) release(rt->rson);
free(rt);
} int main()
{
scanf("%d",&n);
for (int i=;i<n;i++) option();
release(root);
return ;
}

【Treap模板详细注释】BZOJ3224-普通平衡树的更多相关文章

  1. 【强连通分量】 Kosaraju和Tarjan算法 (标准模板+详细注释)

    codevs 题意:求最大强连通分量的大小以及所包含的顶点有哪些 Tarjan算法 #include<iostream> #include<queue> #include< ...

  2. BZOJ3224普通平衡树——非旋转treap

    题目: 此为平衡树系列第一道:普通平衡树您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数, ...

  3. [luogu3369]普通平衡树(treap模板)

    解题关键:treap模板保存. #include<cstdio> #include<cstring> #include<algorithm> #include< ...

  4. Qt5_简易画板_详细注释

    代码下载链接:  http://pan.baidu.com/s/1hsc41Ek 密码: 5hdg 显示效果如下: 代码附有详细注释(代码如下) /*** * 先新建QMainWindow, 项目名称 ...

  5. BZOJ 1588: Treap 模板

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 12171  Solved: 4352 Description ...

  6. 51nod 1126 求递推序列的第N项 思路:递推模拟,求循环节。详细注释

    题目: 看起来比较难,范围10^9 O(n)都过不了,但是仅仅是看起来.(虽然我WA了7次 TLE了3次,被自己蠢哭) 我们观察到 0 <= f[i] <= 6 就简单了,就像小学初中学的 ...

  7. 一套强大的vim配置文件+详细注释

    phpchina折腾王独家配置,灰常牛叉的一套vim配置,另附有详细注释,自己折腾vim的时候可以参照其中的大部分设置进行一些个性化定制."是否兼容VI,compatible为兼容,noco ...

  8. MFC的PNG贴图按钮类(详细注释)

    MFC的PNG贴图按钮类(详细注释) (转载请注明出处) 作者:梦镜谷雨 萌新第二次写帖子,请多多包涵.末尾附上相应代码(PS公司繁体系统所以部分注释繁体请别介意). 因自带控件不美观,于是网上参考学 ...

  9. dedecms首页入口的详细注释

    今天闲来无事,就拿来dede首页的文件给大家详细解释一遍,以便于新手学习,注释过程非常非常非常的详细,里面解释到dede表前缀#@__代替的原理.解释到dede很多自定义函数的具体位置和具体作用等等疑 ...

随机推荐

  1. POJ2240:Arbitrage(最长路+正环)

    Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29374   Accepted: 12279 题目链接: ...

  2. 转:RBAC权限控制

    名词解释: RBAC:Role-Based Access Control,基于角色的访问控制   关键词: RBAC,Java Shiro,Spring Security,   一. RBAC 要解决 ...

  3. leetcode-501. Find Mode in Binary Search Tree

    Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred ...

  4. hadoop之shuffle详解

    Shuffle描述着数据从map task输出到reduce task输入的这段过程. 如map 端的细节图,Shuffle在reduce端的过程也能用图上标明的三点来概括.当前reduce copy ...

  5. Spring - IoC(6): 作用域

    Spring 支持五种作用域,分别是 singleton.prototype.request.session 和 global session. 作用域 说明  singleton (默认作用域)单例 ...

  6. tr/td

    在HTML中,tr代表行,td代表列. 说明: 1.tr与td必须一起使用,并且输入的内容必须在td里面: 2.td必须在tr里面,表示在一行中的列: 3.在一个tr里面,有x个td,就表示在这一行里 ...

  7. [bzoj2599][IOI2011]Race——点分治

    Brief Description 给定一棵带权树,你需要找到一个点对,他们之间的距离为k,且路径中间的边的个数最少. Algorithm Analyse 我们考虑点分治. 对于子树,我们递归处理,所 ...

  8. kvm源代码分析

    vmx是x86硬件虚拟化层,从代码看,qemu用户态是一层,kernel中KVM通用代码是一层,类似kvm_x86_ops是一层,针对各个不同的硬件架构,而vcpu_vmx则是具体架构的虚拟化方案一层 ...

  9. C#字节数组的常用解码处理方法

    在某些情况下,比如说串口通信或者读取二进制的文件,通常会得到一个byte数组形式的数据. 然而对于这个数据处理常常令人苦恼,因为通常通信情况下,并不是一个字节代表一个字符或者某个数据,而是数据夹杂在字 ...

  10. Ubuntu 18.04 sublime text 3176 安装、汉化及配置中文输入

    转载自:https://blog.csdn.net/weixin_42508385/article/details/82152393 一.下载: 在https://www.sublimetext.co ...