【算法笔记】求给定序列的第k大(权值线段树/直接离散化)

普通线段树的叶子节点(最下面一层,从左到右的编号i依次是1,2,3..n)记录的是a[i],即给定的序列值

权值线段树的叶子节点i对应的cnt[i]记录的是序列去重后第i小的数出现的次数,对于给定的序列需要离散化确定大小

如序列:[1,1,2,3,3,4,4,4,4,5],对应的权值线段树为:

图中第二层的9表示序列中的前9小的数都在上一个节点的左子树,1表示第9+1-第10小的数都在上一个节点的右子树,其他同理。

(图源https://blog.csdn.net/Stupid_Turtle/article/details/80445998


权值线段树法:(整体二分查找)

测试样例:

7
3 3 2 1 5 5 7

#include <bits/stdc++.h>
using namespace std;
const int maxn = 300005;
int a[maxn], b[maxn], cnt[maxn];
void update(int id )
{
    cnt[id] = cnt[id << 1] &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值