普通线段树的叶子节点(最下面一层,从左到右的编号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] &