二分的时候,如果你这样写:
while (l <= r) {
int M = (l + r) >> 1;
if (gt(M) <= res) r = M - 1;
else l = M + 1;
}
把上述代码第 3 行的 <=
改成 <
即可,如下:
```cpp
while (l <= r) {
int M = (l + r) >> 1;
if (gt(M) < res) r = M - 1;
else l = M + 1;
}
这样可以大大减少二分的工作量。
根号分治时,块的大小设置为 nlogn 是最合适的,此时时间复杂度为 O(nnlogn)。如果你将块的大小设置为 n,那么时间复杂度会变为 O(nnlogn),并不是最优的。