Loading

P9371 [APIO2023] 序列 / sequence

这题凭啥简单啊?

中位数考虑设计 \(-1, 1\) 状态,但是一般我们都是搭配二分使用,只要求和 \(\ge 0\) 即可,但是这里需要得到中位数的充要条件,显然就不能这么马马虎虎。

那么一个区间 \([l, r]\) 的中位数为 \(c\),当且仅当:

  • \([l, r]\) 中出现了 \(c\)
  • \(\le c\) 的数个数大于等于 \(> c\) 的数个数。
  • \(\ge c\) 的数个数大于等于 \(< c\) 的数个数。

这就非常好了,设第一种情况 \([1, i]\) 的前缀和为 \(s_{0, i}\),第二种情况 \([1, i]\) 的前缀和为 \(s_{1, i}\),一切工作就绪,但是第一个条件不好刻画,不妨将第一个条件去掉,·因为我们本来就是要求 \(\max\)\(0\) 肯定不会被纳入 \(\max\) 之列。

接下来枚举单个 \(c\),可以从 \(1\) 扫到 \(i\),那么形式上就是计算一个三维偏序最值问题,看似是三维偏序,实则发现 \(l > r\) 必定不优,所以就是二维偏序,现在时间复杂度可以做到 \(O(n^2 \log n)\)

最后就是一些 dirty work,注意到缩掉所有不包含 \(c\) 的段,每个段里我只关心 \(s\) 的极值,通过一些手法处理可以得到这个值的位置,比如说你线段树去处理,这样就可以得到 \(O(n \log n)\) 的复杂度。

posted @ 2026-05-27 10:06  Alexande  阅读(11)  评论(0)    收藏  举报