Bootstrap

树状数组倍增

所需变量

a i a_i ai 离散化后,第 i i i 个数出现过的次数。
t r e e i tree_i treei 树状数组。

思路

一个简单的常识,每个数的排名,等于小于它的数的数量,也就是 ( ∑ k = 1 n a i ) + 1 (\sum_{k = 1}^{n} a_i)+1 (k=1nai)+1
要求排名第 k k k 的数,其实就是 k k k 的最大值。
也就是 ( ∑ k = 1 n a i ) + 1 ≤ k − 1 (\sum_{k = 1}^{n} a_i)+1 \leq k-1 (k=1nai)+1k1
左边边可以用树状数组来求,枚举一个 r r r,最大的就是 k − 1 k-1 k1 了。这个地方就要用到倍增了。

树状数组第 i i i ∑ j = i − l o w b i t ( i ) + 1 i a i \sum_{j=i-lowbit(i)+1}^{i} a_i j=ilowbit(i)+1iai

我们可以倍增枚举 2 l o g n , 2 l o g n − 1 , . . . , 1 2^{log_n},2^{log_{n-1}},...,1 2logn,2

;