模板题: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. 杭电hdu 2089 数位dp

    杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍 ...

  2. 使用http_load网站压力测试

    http_load用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工具, 它可以以一个单一的进程运行,一般不会把客户机搞死.它可以自定义测试的URL列表 下载:http://acme.c ...

  3. JavaScript获取HTML元素样式的方法(style、currentStyle、getComputedStyle)

    一.style.currentStyle.getComputedStyle的区别 style只能获取元素的内联样式,内部样式和外部样式使用style是获取不到的. currentStyle可以弥补st ...

  4. 用eval转化对象

    var str = '{"name": "tom","age": 12,"sex": "man"}' ...

  5. (转)C/S 与 B/S 区别

    感谢:http://www.cnblogs.com/xiaoshuai/archive/2010/05/25/1743741.html C/S结构,即Client/Server(客户机/服务器)结构, ...

  6. #学习方法2打印为空,说明#延迟加载#解决方案:将nameField等设置改在viewDidLoad中设置

    #学习方法#error调试#NSLog调试之无法进行数据传输,Edit无法现实之前编辑 的内容             https://www.evernote.com/shard/s227/sh/c ...

  7. 【BZOJ 3907】网格(Catalan数)

    题目链接 这个题推导公式跟\(Catalan\)数是一样的,可得解为\(C_{n+m}^n-C_{n+m}^{n+1}\) 然后套组合数公式\(C_n^m=\frac{n!}{m!(n-m)!}\) ...

  8. [bzoj3697]采药人的路径——点分治

    Brief Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材. 采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是阳性的. 采药人每天 ...

  9. bzoj 1067 特判

    这道题的大题思路就是模拟 假设给定的年份是x,y,首先分为4个大的情况,分别是 x的信息已知,y的信息已知 x的信息已知,y的信息未知 x的信息未知,y的情况已知 x的信息未知,y的情况未知 然后对于 ...

  10. Linux XZ格式的解压

    xz这个压缩可能很多都很陌生,不过您可知道xz是绝大数linux默认就带的一个压缩工具. 之前xz使用一直很少,所以几乎没有什么提起. 我是在下载phpmyadmin的时候看到这种压缩格式的,phpm ...