Description
给定长度为 $n\ (n \leq 10^5)$ 的排列,求有多少包含 $b\ (1 \leq b \leq n)$ 的奇数长度的序列中位数为 $b$ 。
Source
Solution
因为所求的是中位数,所以考虑改变原序列。把大于 $b$ 的数全部变为 $1$,小于 $b$ 的数变为 $-1$,等于 $b$ 则为 $0$ 。问题就变为求存在几个包含 $b$ 的区间和为 $0$ 。我们假设 $tmp$ 为 $b$ 的下标,原数组为 $x$,新数组为 $a$ 。
Sample Input
1 | 7 4 |
Sample Output
1 | 4 |
Example
对于样例,能使结果成立的 $4$ 个区间分别为 $[1,5]$,$[1,7]$,$[2,4]$,$[4,4]$ 。
接下来我们建造两个桶,分别计数 $tmp$ 左边的后缀和与右边的前缀和,假设左边的后缀和为 $l$,右边的前缀和为 $r$ 。$l[i]/r[i]$ 表示从点 $i$ 向右/向左 到点 $tmp$ 为止 (比 $b$ 大的数的数量 - 比 $b$ 小的数的数量) 出现的次数。还是拿样例来说:
通过观察上图,我们能够发现,左边的数 $x$ 可以与右边的每一个 $-x$ 进行匹配。通过乘法原理,该值即为 $l[x] \times r[-x]$,由题意可知 $-10^5 \le x \le 10^5$,遍历所有的 $x$ 即可,最终答案为:
值得注意的是,$l[0]$ 和 $r[0]$ 的初始值为 $1$,因为 $b$ 是需要被算入的。当然,桶的下标不能是负数,所以我在每次操作时都加上了一个很大的数,比如数据最大值 —— $10^5$,也可以用 $\mathrm{STL}$ 中的 $map$ 解决问题,时间复杂度为 $O(n)$ 。
Code
1 |
|