因为值域 很小,因此考虑直接枚举值域。正难则反,则答案即为总对数 减去不合法的对数。显然不合法的对数需要满足其长度为偶数,且中位数有两个(即不符合题目给的条件)。于是考虑经典套路。设当前枚举的中位数是 ,则定义另一个数组 :若 ,则 ,否则 。此时数组不合法当且仅当 ,可以直接使用 map 来统计。
但是这样是错的。若某一个不合法区间,其两个中位数分别为 (),则其会被重复计数 遍。于是考虑直接钦定其相对较小的中位数 的值必须为 再统计答案。具体的说,对于每一个 均存储两个指针 。每一次扫描到下一个位置的时候,先向右移动 使得 ,然后若此时 ,则将 段内的答案全部加入 map 中,并令 。这样做可以保证每一个不合法区间都不会被重复统计。总时间复杂度为 ,可以通过。
代码。
喜欢的话,留下你的评论吧~