区间中位数两例

给定数组 \(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\) 的区间有多少个。

代码

posted @ 2019-11-15 16:55  Pat  阅读(656)  评论(0编辑  收藏  举报