为了彻底理解树状数组,试着用树状数组做了下普通平衡树

而树状数组只能离线做,或者保证值的大小在数组可承受的范围内也是可以的,因为要求离线是因为必须事前对所有数离散化。

然后我们看刘汝佳蓝书上的图

利用如下代码,可以找到所有前缀和中第一个大于等于k的

 int kth(int k) {
int ans=;
for(int i=;i>=; --i) {
ans += <<i;
if(ans>=sz || C[ans]>=k) ans-=<<i;
else k-=C[ans];
}
return seq[ans+];
}

什么原理呢,我们这么理解,把树状数组看成一棵树,事实上他的节点编号的中序遍历是有序的,跟平衡树有异曲同工之妙,假设现在在(1000)2这个点,如果往左走,就相当于没有取[1,8],接着在[1,7]中取,如果往右走,就相当于取了[1,8],接着在[9,15]中取,至于应该往左走还是往右走跟平衡树找第k大是一样的。然后可以发现,平衡树相当于是在[1,n]上建树的,而二叉索引树是在[1,2^k](k为2^k>=n的最小正整数)。

给出普通平衡树的完整代码

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm> using namespace std; const int Maxn=; int C[Maxn],sz; int sum(int x) {
int ret=;
for(;<x && x<=sz; x-=x&-x) ret+=C[x];
return ret;
} void add(int x,int d) {
for(;<x&&x<=sz; x+= x&-x) C[x]+=d;
} int seq[Maxn],tot;
void HashInit() {
sort(seq+,seq+tot+);
sz = unique (seq+,seq+tot+) - (seq+);
}
int hash(int x) {
return lower_bound(seq+,seq+sz+,x) - seq;
} int opt[Maxn],num[Maxn]; int kth(int k) {
int ans=;
for(int i=;i>=; --i) {
ans += <<i;
if(ans>=sz || C[ans]>=k) ans-=<<i;
else k-=C[ans];
}
return seq[ans+];
} int main() {
#ifdef DEBUG
freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif int n;
scanf("%d",&n);
for(int i=;i<=n;i++) {
scanf("%d%d",opt+i,num+i);
if(opt[i]!=) seq[++tot] = num[i];
} HashInit(); for(int i=;i<=n;i++) {
if(opt[i]==) add(hash(num[i]),);
if(opt[i]==) add(hash(num[i]),-);
if(opt[i]==) printf("%d\n",sum(hash(num[i])-)+);
if(opt[i]==) printf("%d\n",kth(num[i]));
if(opt[i]==) printf("%d\n",kth(sum(hash(num[i])-)));
if(opt[i]==) printf("%d\n",kth(sum(hash(num[i]))+));
} return ;
}

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

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

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

  2. [bzoj3196][tyvj1728]普通平衡树

    真是太差了,到现在才打出一个平衡树的板子.. 感谢blackjack大佬提供的数组版treap板子!!基本完全照搬,blackjack太神啦! 但目前我只会这几个最基本的操作(说白了STL的(mult ...

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

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

  4. [Bzoj3224][Tyvj1728] 普通平衡树(splay/无旋Treap)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3224 平衡树入门题,学习学习. splay(学习yyb巨佬) #include<b ...

  5. [bzoj3224][tyvj1728][普通平衡树] (pb_ds库自带红黑树)

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相 ...

  6. [BZOJ3224/Tyvj1728]普通平衡树

    本篇博客有详细题解,浅谈算法--splay

  7. 斜堆,非旋转treap,替罪羊树

    一.斜堆 斜堆是一种可以合并的堆 节点信息: struct Node { int v; Node *ch[]; }; 主要利用merge函数 Node *merge(Node *x, Node *y) ...

  8. [TYVJ1728/BZOJ3224]普通平衡树-替罪羊树

    Problem 普通平衡树 Solution 本题是裸的二叉平衡树.有很多种方法可以实现.这里打的是替罪羊树模板. 此题极其恶心. 前驱后继模块需要利用到rank模块来换一种思路求. 很多细节的地方容 ...

  9. 【BZOJ3224】【tyvj1728】普通平衡树

    最近开始学习平衡树,在学长的强烈推荐下学习了AVL.红黑树.splay(以上我都还没学)treap. 首先讲一下个人对treap(树堆)的理解. treap,顾名思义,就是tree+heap,首先因为 ...

随机推荐

  1. FlightGear 视角控制

    Flightgear提供了非常灵活的模块化功能 这里就简要记录一下视角切换功能 首先,需要了解一下Flightgear中的property tree的主要内容,这里暂略. http://wiki.fl ...

  2. 启动scala的方法

    1.从官网 http://www.scala-lang.org/download/ 下载scala二进制通用版本以后,在终端命令行添加下载解压包的bin目录到环境变量: export PATH=/Us ...

  3. cocos2dx ease 公式

    所有ease计算公式都在CCTweenFunction.cpp里.

  4. IOS DLNA PlatinumKit库的使用

    前段时间进行了IOS DLNA的开发,使用的是PlatinumKit库.网上查了很多资料都未果,经过自己的摸索,遂将如何使用PlatinumKit进行DLNA的开发分享给大家. 1.PlatinumK ...

  5. 异步IO简介

    最近想学习一下libevent,就先翻译一下libevent的官方文档吧. 英文原文链接:http://www.wangafu.net/~nickm/libevent-book/01_intro.ht ...

  6. Ajax基础--JavaScript实现

    ajax原理 1.ajax 即“Asynchronous JavaScript and XML”(异步 JavaScript 和 XML),也就是无刷新数据读取. 通俗地讲就是:AJAX 通过在后台与 ...

  7. PHP获取客户端和服务器端IP

    客户端的ip变量: $_SERVER['REMOTE_ADDR'] :客户端IP,也有可能是代理IP $_SERVER['HTTP_CLIENT_IP']:代理端的IP,可能存在,也可能伪造 $_SE ...

  8. PHP数据学习-二维数组【3】

    <?php // $project = array( // array("bai",12,23.0), // array("zeng",34,12.0), ...

  9. NandFlash驱动框架

    1.首先和前面的几个驱动程序相似,需要分配一个nand_chip结构体 s3c_nand = kzalloc(sizeof(struct nand_chip), GFP_KERNEL); 然后填充该结 ...

  10. NameNode元数据的管理机制(三)

    元数据的管理: 第一步:客户端通过DistributedFilesystem 对象中的creat()方法来创建文件,此时,RPC会 通过一个RPC链接协议来调用namenode,并在命名空间中创建一个 ...