题解 P5048【[Ynoi2019 模拟赛] Yuno loves sqrt technology III】
$\text{Upd2024.2.13}$:正好跳到这题,修改一下三年前题解的 $\LaTeX$ 吧,之前写得实在是太丑了。
题意
区间众数出现次数,强制在线。
$n,q\le 5\times 10^5$。
思路
考虑将序列按块长 $B$ 分块。
首先,如果 $l,r$ 在一个块内,可以直接暴力。
对于整块部分,我们预处理 $f_{L,R}$ 代表第 $L$ 个块与第 $R$ 个块内的众数的出现次数。这是平凡的。
考虑逐个加入散块部分的数,维护 $ans$ 表示当前众数出现次数,如果新加入的 $x$ 比现在的答案优,则它至少在 $[l,r]$ 内出现 $ans+1$ 次。
那么我们不妨枚举散块内的数,依次判断这个数在区间内是否出现了 $ans+1$ 次或以上,如是则将 $ans$ 加一直到出现次数不及 $ans+1$。
求一个数在区间中的出现次数看似困难,以左散块部分为例(右散块部分同理),其实我们求的是位置为 $p$ 的数在 $[p+1,r]$ 这段区间内出现次数是否达到 $c$ 次。我们使用 vector 存下每种数出现的所有下标,并求出 $t_i$ 数组表示 $a_i$ 这个数是第几次出现(即在 $i$ 在相应 vector 中的下标,注意加减一),那么上述问题即为 $a_p$ 对应 vector 的第 $t_p+c-1$ 个数是否 $\le r$。
分析复杂度,$n,q$ 同阶,时间复杂度为 $O(\dfrac{n^2}B+nB)$,令 $B=\Theta(\sqrt n)$,时间复杂度取到 $O(n\sqrt n)$,空间复杂度线性。
代码实现不难,我三年前的码风十分难接受,如果实在有需要,可以在此云剪切版查看。

浙公网安备 33010602011771号