区间中位数两例

给定数组 $a_1, a_2, dots, a_N$。

hihoCoder #1849 子数组的中位数

中位数数定义为排序后第 $floor{(N+1)/2}$ 个数。
中位数大于 $k$ 等价于数组中大于等于 $k$ 的数超过一半。
定义数组 $b_1, b_2, dots, b_N$,
egin{aligned}
b_i :=
egin{cases}
1, & ext{if $a_i ge k$}, \
-1, & ext{if $a_i < k$}.
end{cases}
end{aligned}
区间 $a_l, dots, a_r$ 的中位数大于等于 $k$ 等价于 $sum_{i = l}^{r} b_i > 0$。
利用数状数组可在 $O(Nlog N)$ 的时间内算出中位数大于等于 $k$ 的区间有多少个。

代码

ABC107 Task D. Median of Medians

中位数定义为排序后第 $floor{N/2} + 1$ 个数。
中位数 $le k$ 等价于数组中小于等于 $k$ 的数超过一半。
定义数组 $b_1, b_2, dots, b_N$,
egin{aligned}
b_i :=
egin{cases}
1, & ext{if $a_i le k$}, \
-1, & ext{if $a_i > k$}.
end{cases}
end{aligned}
区间 $a_l, dots, a_r$ 的中位数小于等于 $k$ 等价于 $sum_{i = l}^{r} b_i > 0$。
利用数状数组可在 $O(Nlog N)$ 的时间内算出中位数小于等于 $k$ 的区间有多少个。

代码

原文地址:https://www.cnblogs.com/Patt/p/11867770.html