根号分治

例题

1.Remainder Problem

两种暴力

  • 按题意模拟,修改时间复杂度 $O(1)$,查询时间复杂度 $O(n)$。

  • 维护一个 $b$ 数组,$b_{ij}$ 表示所有模 $i$ 得 $j$ 的下标的数之和,修改时间复杂度 $O(n)$,查询时间复杂度 $O(1)$。

两种暴力时间复杂度极不平衡。考虑设计一个阈值 $B$,将询问分成两块,分别处理。对于 $\le B$ 的,用法二。对于大于 $B$ 的,用法一。

取 $B=\sqrt n$,时间复杂度 $O(q\sqrt n)$。

code

由于数据问题,块长取理论最优块长不一定最优。

2.Two Arithmetic Progressions

不妨设 $a_1>=a_2$。有两种暴力

  • 枚举。时间复杂度 $O(\frac{n}{a_1})$。

  • 循环节大小为 $lcm(a_1,a_2)$,找到第一个重复的位置 $x$,答案即为 $\left\lfloor \frac{R-x}{lcm(a_1,a_2)}\right\rfloor +1$。时间复杂度 $O(\frac{lcm(a_1,a_2)}{a_1})$。

将两个暴力拼一起,记 $B=\sqrt{2 \times 10^9} \approx 44722$。小于或等于 $\le B$ 的用法二,否则用法一。

code

3.[IOI2009] Regions

点染色很显然可以根号分治,然后就 $O(n\sqrt{n})$ 了。

对于都为小颜色的,我使用了虚树求解。需要大力卡常,包括但不限于

  • 用 dfs 序求 lca。

  • 按 dfs 序排序时用归并排序。

  • 限制大颜色的数量,将每个颜色对应的点的个数求出,取第 $k$ 大为阈值。

  • 邻接表换为链式前向星。

code

4.[ARC052D] 9

数位之和最大为 $90$。对 $K$ 分讨

  • $K \le \sqrt{M}$,直接枚举。

  • $K \le \sqrt{M}$,数位 DP。

参考

根号分治