CF1446D1 & D2

一开始看题看成计数这样的区间了,想自闭了 QAQ。

我们先手玩一下看看这样的区间有没有什么性质(记录一下踩的坑):

  • 满足条件的区间有没有可能不多?显然并不是,考虑 \(1,1,1\dots\),是 \(O(n^2)\) 的。
  • 对于某一类区间(右端点相同/长度相等),有没有可能满足条件的区间成一组组地分布(比如左端点是连续的)。事实上并不是,考虑 \(1,2,1,2\dots\),满足条件的区间变动是很大的。
  • 我不会了

事实上,上面的考察性质都是为了减少我们枚举满足条件的区间的数量/打包计数。倘若这是一道计数题,没有这样的性质我们是很难做的。但是,这是一道最优化问题,我们可以只考虑对答案能造成影响的区间。也就是说,如果我们能证明某一类区间一定不如另一类区间,那前者就不必考虑了。

回到题目,我们很自然地想知道整个序列是否是满足条件的。如果满足直接做完了,如果不满足,也就是说有一个唯一的众数 \(c\)

经过一番手玩,我们发现答案区间一定是以 \(c\) 为其中一个众数的。可以证明吗?

是可以的!

假如不是这样,答案区间是一个 \([l,r]\),记其某一个众数是 \(c'\)\(c,c'\) 出现次数分别为 \(p,p'\)。因为 \(c\) 不是其中的众数,所以 \(p'<p\)。我们考虑能不能构造一个含有 \(c\) 的不劣的答案。考察对 \([l,r]\) 做扩张能得到的所有区间,由于 \(c\) 是最多的,那么在 \([l,r]\rightarrow[1,n]\) 这一过程中,\(c\) 出现次数 \(p'\rightarrow maxc\)\(c'\) 出现次数 \(p\rightarrow maxc'\)。这一过程中一定存在某一时刻二者出现次数相等,故这样的区间一定不是答案,我们可以忽略。

既然如此,我们可以枚举答案区间中,数 \(s\)\(c\) 出现次数相等,我们可以接受使用 \(O(n)\) 的复杂度统计这样的区间。显然枚举右端点 \(r\),算一个每个位置处 \(s,c\) 出现次数之差即可随便做。

复杂度 \(O(nV)\)

下面我们考虑 \(V\) 过大的情况。

我们考虑对所有颜色进行根号分治。

  • 对于其中出现次数 \(> B\) 的,这样的数不会超过 \(\frac{V}{B}\) 个,我们可以使用上面的方法在 \(O(n\frac{V}{B})\) 内解决。
  • 对于出现次数 \(\le B\) 的,我们考虑一个随意的做法。我们直接枚举众数的出现次数为 \(p\),然后使用双指针扫一遍即可,\(O(nB)\)

综上,取 \(B=\sqrt{V}\),我们得到了一个 \(O(n\sqrt{V})\) 的算法,可以通过。

posted @ 2023-03-02 11:43  PYD1  阅读(26)  评论(0编辑  收藏  举报