区间中位数两例
给定数组 \(a_1, a_2, \dots, a_N\)。
hihoCoder #1849 子数组的中位数
中位数数定义为排序后第 \(\floor{(N+1)/2}\) 个数。
中位数大于 \(k\) 等价于数组中大于等于 \(k\) 的数超过一半。
定义数组 \(b_1, b_2, \dots, b_N\),
\begin{aligned}
b_i :=
\begin{cases}
1, & \text{if \(a_i \ge k\)}, \\
-1, & \text{if \(a_i < k\)}.
\end{cases}
\end{aligned}
区间 \(a_l, \dots, a_r\) 的中位数大于等于 \(k\) 等价于 \(\sum_{i = l}^{r} b_i > 0\)。
利用数状数组可在 \(O(N\log N)\) 的时间内算出中位数大于等于 \(k\) 的区间有多少个。
ABC107 Task D. Median of Medians
中位数定义为排序后第 \(\floor{N/2} + 1\) 个数。
中位数 \(\le k\) 等价于数组中小于等于 \(k\) 的数超过一半。
定义数组 \(b_1, b_2, \dots, b_N\),
\begin{aligned}
b_i :=
\begin{cases}
1, & \text{if \(a_i \le k\)}, \\
-1, & \text{if \(a_i > k\)}.
\end{cases}
\end{aligned}
区间 \(a_l, \dots, a_r\) 的中位数小于等于 \(k\) 等价于 \(\sum_{i = l}^{r} b_i > 0\)。
利用数状数组可在 \(O(N\log N)\) 的时间内算出中位数小于等于 \(k\) 的区间有多少个。