真是太差了,到现在才打出一个平衡树的板子。。

感谢blackjack大佬提供的数组版treap板子!!基本完全照搬,blackjack太神啦!

但目前我只会这几个最基本的操作(说白了STL的(multi)set)也能干。。。

还差的好远-_-

#include<bits/stdc++.h>
#define L T[x].ls
#define R T[x].rs
using namespace std;
const int N=;
int root,sz,ans;
struct Node{
int val,sz,cnt,ls,rs,key;
}T[N];
void ref(int x){
T[x].sz=T[L].sz+T[R].sz+T[x].cnt;
}
void zig(int &x){
int y=R;
T[x].rs=T[y].ls;T[y].ls=x;
T[y].sz=T[x].sz;ref(x);ref(y);x=y;
}
void zag(int &x){
int y=L;
T[x].ls=T[y].rs;T[y].rs=x;
T[y].sz=T[x].sz;ref(x);ref(y);x=y;
}
void ins(int &x,int v){
if(!x){
x=++sz;
T[x]=(Node){v,,,,,rand()};
return;
}
if(T[x].val==v){
T[x].cnt++;T[x].sz++;
return;
}
T[x].sz++;
if(T[x].val<v){
ins(R,v);
if(T[R].key<T[x].key)
zig(x);
}
else{
ins(L,v);
if(T[L].key<T[x].key)
zag(x);
}
}
void del(int &x,int v){
if(!x)return;
if(T[x].val==v){
if(T[x].cnt>){
T[x].cnt--;T[x].sz--;
return;
}
if(!(L*R)){
x=L+R;return;
}
if(T[L].key<T[R].key)
zag(x),del(x,v);
else
zig(x),del(x,v);
}
else{
T[x].sz--;
if(T[x].val<v)del(R,v);
else del(L,v);
}
}
void pre(int x,int v){
if(!x)return;
if(T[x].val<v)
ans=x,pre(R,v);
else pre(L,v);
}
void nxt(int x,int v){
if(!x)return;
if(T[x].val>v)
ans=x,nxt(L,v);
else nxt(R,v);
}
int qnum(int x,int rk){
if(!x)return ;
if(rk<=T[L].sz)
return qnum(L,rk);
if(rk>T[L].sz+T[x].cnt)
return qnum(R,rk-T[L].sz-T[x].cnt);
return T[x].val;
}
int qrank(int x,int v){
if(!x)return ;
if(T[x].val==v)
return T[L].sz+;
if(T[x].val<v)
return qrank(R,v)+T[L].sz+T[x].cnt;
return qrank(L,v);
}
int main(){
int n;scanf("%d",&n);
while(n--){
int opt,t;scanf("%d%d",&opt,&t);
ans=;
switch(opt){
case :ins(root,t);break;
case :del(root,t);break;
case :ans=qrank(root,t);printf("%d\n",ans);break;
case :ans=qnum(root,t);printf("%d\n",ans);break;
case :pre(root,t);printf("%d\n",T[ans].val);break;
case :nxt(root,t);printf("%d\n",T[ans].val);break;
}
}
}

[bzoj3196][tyvj1728]普通平衡树的更多相关文章

  1. tyvj1728 普通平衡树

    为了彻底理解树状数组,试着用树状数组做了下普通平衡树 而树状数组只能离线做,或者保证值的大小在数组可承受的范围内也是可以的,因为要求离线是因为必须事前对所有数离散化. 然后我们看刘汝佳蓝书上的图 利用 ...

  2. BZOJ3196二逼平衡树——线段树套平衡树(treap)

    此为平衡树系列最后一道:二逼平衡树您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询 ...

  3. bzoj3196 二逼平衡树

    题目链接 平衡树系列最后一题 坑啊 10s时间限制跑了9764ms...还是要学一学bit套主席树啦... 经典的线段树套treap...至于第一发为什么要TLE(我不会告诉你treap插入的时候忘了 ...

  4. 【bzoj3224】 Tyvj1728—普通平衡树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3224 (题目链接) 题意 1. 插入x数:2. 删除x数(若有多个相同的数,因只删除一个):3. 查 ...

  5. BZOJ3196 二逼平衡树 ZKW线段树套vector(滑稽)

    我实在是不想再打一遍树状数组套替罪羊树了... 然后在普通平衡树瞎逛的时候找到了以前看过vector题解 于是我想:为啥不把平衡树换成vector呢??? 然后我又去学了一下ZKW线段树 就用ZKW线 ...

  6. bzoj3196 二逼平衡树 树状数组套线段树

    题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...

  7. BZOJ3196 二逼平衡树 【线段树套平衡树】

    题目 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查询k在区间内的前驱(前驱 ...

  8. bzoj3196 二逼平衡树 树套树(线段树套Treap)

    Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4697  Solved: 1798[Submit][Status][D ...

  9. 初学 Size Balanced Tree(bzoj3224 tyvj1728 普通平衡树)

    SBT(Size Balance Tree), 即一种通过子树大小(size)保持平衡的BST SBT的基本性质是:每个节点的size大小必须大于等于其兄弟的儿子的size大小: 当我们插入或者删除一 ...

随机推荐

  1. Android自定义控件练手——波浪效果

    这一次要绘制出波浪效果,也是小白的我第一次还望轻喷.首先当然是展示效果图啦: 一.首先来说说实现思路. 想到波浪效果,当然我第一反应是用正余弦波来设计啦(也能通过贝塞尔曲线,这里我不提及这个方法但是在 ...

  2. Struts2 简介及学习方法介绍

    Struts2 =  webwork + struts1.x 尊重学习规律的操作 学习上痛苦的根源之一是只能走的时候逼我来跑 不是说深入的内容就不讲了,而是放到合适的时候讲 一段时间可以,长了集中不了 ...

  3. 5步玩转Power BI Embedded,老司机全程带路解析

    最近,由世纪互联运营的 Microsoft Azure 发布了一个超级炫酷的服务 Power BI Embedded,该服务可以通过 REST API 和 Power BI SDK 将 Power B ...

  4. [topcoder]TheGridDivTwo

    http://community.topcoder.com/stat?c=problem_statement&pm=13628&rd=16278 标程是BFS,我用DFS,都可解. 这 ...

  5. Laravel 获取当前 Guard 分析 —源自电商购物车的实际需求

    iBrand 产品中关于购物车的需求比较复杂,我们基于 overture/laravel-shopping-cart 扩展出了更加符合电商需求的购物车包,之前有文章进行过简单的介绍: Laravel ...

  6. 探讨下在Delphi里面进程之间的数据共享

    进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元.现在小编就和大家来探讨一下在Delphi ...

  7. softmax sigmoid

    softmax和sigmoid实际上都是属于logistic regression,sigmoid是二分类的lr,拟合Bernoulli distribution(二项分布):0softmax是多分类 ...

  8. c#右键窗体弹出菜单

    在工具箱(快捷键ctrl+w+x)——菜单和工具栏中找到 在属性中用这个绑定 然后写后台代码

  9. C#操作Word,写数据,插入图片

    本篇介绍的是如何在C#中往word里面写入数据. 如何在线的操作文档:  c#在线操作文档 关于Aspose.Word控件的介绍,请戳→ 介绍 首先需要去下载这个dll文件,然后引用到你的项目当中.地 ...

  10. Linux 性能检查常用命令

    ####消耗CPU最多的进程 [root@Yong ~]# ;|head ##拼接进程号 [root@Yong ~]# |awk '{print $1}' |awk BEGIN{RS=EOF}'{gs ...