P8313 [COCI 2021/2022 #4] Izbori
P8313 [COCI 2021/2022 #4] Izbori
模拟赛题目.
题目描述
Malnar 先生正在竞选县长,这个县一共有 \(n\) 栋房屋,每栋房屋里都住着一位居民。Malnar 先生知道,选举的赢家不一定是最好的候选人,而是在选举前举办的宴会最好的候选人。因此,在选举前几天,他将邀请第 \(l \leq r\) (\(l \leq r\)) 栋房屋内居住的居民,为他们准备一顿丰盛的晚餐。
Malnar 先生知道所有居民最喜欢吃的菜。在宴会上,他会准备大多数人喜欢的一道菜。如果一个人吃到了自己最喜欢吃的菜,将会投一票给 Malnar 先生。但是如果没有吃到自己最喜欢吃的菜,他们将会把票投给 Vlado 先生。如果没有来参加晚宴的居民,他们将会忘记选举,不做出任何投票。如果一个候选人获得了投了票的人中一半以上的人的支持,他将会赢得竞选。
Malnar 先生想知道,有多少组的 \((l, r)\) 可以使他赢得竞选。
思路
对于 \(\forall i \in \{1, 2, 3, \dots, n\}, 1 \le a_i \le 2\) 的 \(\text{Subtask 3}\), 我们考虑这样一个做法: 我们将 \(a_i = 1\) 的位置设为 \(1\), \(a_i = 2\) 的位置设为 \(-1\), 再维护一个前缀 \(sum\) 数组. 此时区间 \([l, r]\) 合法当且仅当 \(sum_r - sum_l > 0\), 可以采用树状数组进行维护. 时间复杂度 \(\mathcal{O}(n \log n)\).
思考以下根号分治. 具体的, 我们设一个阈值 \(B\)
- 对于出现次数 \(\ge B\) 的颜色, 采用上面 \(\text{Subtask 3}\) 的做法, 将该颜色设为 \(1\), 其它颜色设为 \(-1\). 时间复杂度 \(\mathcal{O}(\frac{n^2 \log n}{B})\).
- 对于出现次数 \(x < B\) 的颜色, 则对于该颜色合法的区间长度一定不会超过 \(2x - 1\), 直接暴力枚举即可, 时间复杂度 \(\mathcal{O}(Bn)\).
总复杂度 \(\mathcal{O}(\frac{n^2 \log n}{B} + Bn)\), 当 \(B = \sqrt{n \log n}\) 时最优.
后话
或许可以从 \(\text{Subtask}\) 中找到灵感.

浙公网安备 33010602011771号