P8330 [ZJOI2022] 众数

P8330 [ZJOI2022] 众数

传送门


考虑根号分治。

假如最终答案中两个众数至少有一个出现次数 \(\ge B\)。我们枚举其在内部/外部。

并考虑接着枚举每一种颜色,钦定另外一部分的众数为它。

则贡献类似最大子段和状物,可以线性完成,这部分是 \(\mathcal O(nB)\) 的。


对于两个众数出现次数均 \(<B\) 的,我们枚举外部众数的颜色,并 \(B^2\) 地枚举位置对,每个位置对限制了一个区间,区间内众数+外部个数即为答案。需要查询众数的区间数是 \(\mathcal O(nB)\) 的。

一个观察是我们只需要众数的出现次数而不关心具体值,且结果可以对 \(B\)\(\min\),否则答案会在上一部分被更新。

那么我们考虑对每一个出现次数 \(c\),双指针维护对每个 \(l\),最小的 \(r\) 使得 \([l,r]\) 的众数出现次数 \(=c\)

那么把询问按左端点排序,左端点相同的按右端点排序,双指针即可均摊 \(\mathcal O(1)\) 处理每个查询。

但是排序带 \(\log\),可以通过桶排省下左端点的排序,通过钦定右端点递增枚举来保证有序。这样就可以做到 \(\mathcal O(nB)\) 了。

posted @ 2026-07-27 17:28  CuteNess  阅读(10)  评论(0)    收藏  举报