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)\) 了。
本文来自博客园,作者:CuteNess,转载请注明原文链接:https://www.cnblogs.com/CuteNess/p/21967465

浙公网安备 33010602011771号