如果你 TLE on #8
查看原帖
如果你 TLE on #8
809124
_Passerby_楼主2025/1/19 08:23

二分的时候,如果你这样写:

while (l <= r) {
  int M = (l + r) >> 1;
  if (gt(M) <= res) r = M - 1;
  else l = M + 1;
}

把上述代码第 33 行的 <= 改成 < 即可,如下:

```cpp
while (l <= r) {
  int M = (l + r) >> 1;
  if (gt(M) < res) r = M - 1;
  else l = M + 1;
}

这样可以大大减少二分的工作量。


根号分治时,块的大小设置为 nlogn\sqrt{n \log n} 是最合适的,此时时间复杂度为 O(nnlogn)O(n \sqrt{n \log n})。如果你将块的大小设置为 n\sqrt{n},那么时间复杂度会变为 O(nnlogn)O(n \sqrt{n} \log n),并不是最优的。

2025/1/19 08:23
加载中...