|
|
双倍经验:4388. [Ynoi2019 模拟赛] Yuno loves sqrt technology I 好像还有个离线数据加强版但是我忘了题号了。 题意:强制在线查询区间 [l, r] 的众数,$n \leq 4\times 10^4$,$m \leq 5\times 10^4$。由$a_i$范围知道要离散化一下,记录每个值出现位置为$idx[x] = \{pos_1, pos_2, ..., pos_k\}$,同时如果要$O(1)$查询$j$在第$L$块到第$R$块之间的出现次数,就可以用前缀和预处理。 接着枚举起点块$i$,维护计数数组cnt,从块$i$往后逐块扩展$j$。每扩展一块,把该块所有数加入cnt,更新当前众数,记录到$p[i][j]$。 然后对于询问$[l, r]$,设$l$在块$bl$,$r$在块$br$。 如果同块或者相邻,那直接$O(2\sqrt{n})$枚举一下就完事了;如果跨块了,那就还是分成两小碎块和一大块处理。这时候发动我们的注意力:显然众数的候选区只有三个:1. 中间完整块的众数:$cand = p[bl+1][br-1]$ 2. 左零散中出现的每个数 3. 右零散中出现的每个数。这是为什么呢?显然中间完整快内其他蒲公英出现次数不可能比这几个众数还大,所以直接取中间众数,候选数最多$2B+1 \approx 401$个,每次$O(\log n)$,很舒服。 所以总复杂度预处理$O(n\sqrt{n})$,单次查询$O(\sqrt{n} \log n)$,总$O((n+m)\sqrt{n} \log n)$。很合理的一个式子。
2026-06-30 20:47:46
|