逆天操作分块 O(n sqrt {n log n}) 做法的警示后人

CF1254D Tree Queries

Shunpower @ 2024-01-22 11:07:31

令块长为 B,通过操作分块可以得到一个 \mathcal O(Bn\log n+\frac{q^2}{B}\log n) 的做法。两只 \log 分别来自重构的基于 BIT 和块内修改的贡献需要倍增求 k 级祖先。和这篇题解的第一个做法是一样的。

这个做法确实非常卡,我卡了一个多小时。下面是一些警示后人的方法:

  1. 把块长改成 \sqrt {q(1+\log q)},不知道为什么反正就是很快。
  2. 把重构改成不递归的版本,实测快了非常多。
  3. 减少树状数组的修改次数。
  4. 可以把 n^{-1} 之类的常数提出来,不用乘那么多次。
  5. 实在不行就把 k 级祖先改成长剖。

by Shunpower @ 2024-01-22 11:11:03

前两条针对死活过不了 \texttt{test 6}\texttt{test 17} 很有效。

这里减少修改次数不只是减少外观上的修改次数,加上 0 也要判掉。这对 \texttt{test 71} 很有效。


by Shunpower @ 2024-01-22 11:28:02

我草,复杂度写错了,是 \mathcal O(B^2\log n+\frac{q}{B}n\log n)


by Shunpower @ 2024-01-22 11:46:20

@Shunpower 那我知道为什么了,\sqrt {q(1+\log q)} 就是贴着最佳块长 \sqrt{q\log q} 的。


|