Loading docs/misc/parallel-binsearch.md +3 −3 Original line number Diff line number Diff line Loading @@ -38,7 +38,7 @@ ### 查询第k小:一次二分多个询问 > **题1** 在一个数列中查询第 $k$ 小的数。 > **题1** 在一个数列中查询第 $k$ 小的数。 当然可以直接排序。如果用二分法呢?可以用数据结构记录每个大小范围内有多少个数,然后用二分法猜测,利用数据结构检验。 Loading @@ -46,7 +46,7 @@ 可以对于每个询问进行一次二分;但是,也可以把所有的询问放在一起二分。 先考虑二分的本质:假设要猜一个 $[l,r]$ 之间的数,猜测之后会知道是猜大了,猜小了还是刚好。当然可以从 $l$ 枚举到 $r$,但更优秀的方法是二分:猜测答案是$m = \lfloor\frac{l + r}{2}\rfloor$ ,然后去验证 $m$ 的正确性,再调整边界。 先考虑二分的本质:假设要猜一个 $[l,r]$ 之间的数,猜测之后会知道是猜大了,猜小了还是刚好。当然可以从 $l$ 枚举到 $r$,但更优秀的方法是二分:猜测答案是$m = \lfloor\frac{l + r}{2}\rfloor$ ,然后去验证 $m$ 的正确性,再调整边界。 回过头来,对于当前的所有询问,可以去猜测所有询问的答案都是 $mid$,然后去依次验证每个询问的答案应该是小于等于 $mid$ 的还是大于 $mid$ 的,并将询问分为两个部分(不大于/大于),对于每个部分继续二分。注意:如果一个询问的答案是大于 $mid$ 的,则在将其划至右侧前需更新它的 $k$,即,如果当前数列中小于等于 $mid$ 的数有 $t$ 个,则将询问划分后实际是在右区间询问第 $k - t$ 小数。如果一个部分的 $l = r$ 了,则结束这个部分的二分。 Loading Loading @@ -218,7 +218,7 @@ void solve( int l, int r, int L, int R ) } ``` ### 参考习题 ### 参考习题 [「国家集训队」 矩阵乘法 ](https://www.luogu.org/problemnew/show/P1527) Loading Loading
docs/misc/parallel-binsearch.md +3 −3 Original line number Diff line number Diff line Loading @@ -38,7 +38,7 @@ ### 查询第k小:一次二分多个询问 > **题1** 在一个数列中查询第 $k$ 小的数。 > **题1** 在一个数列中查询第 $k$ 小的数。 当然可以直接排序。如果用二分法呢?可以用数据结构记录每个大小范围内有多少个数,然后用二分法猜测,利用数据结构检验。 Loading @@ -46,7 +46,7 @@ 可以对于每个询问进行一次二分;但是,也可以把所有的询问放在一起二分。 先考虑二分的本质:假设要猜一个 $[l,r]$ 之间的数,猜测之后会知道是猜大了,猜小了还是刚好。当然可以从 $l$ 枚举到 $r$,但更优秀的方法是二分:猜测答案是$m = \lfloor\frac{l + r}{2}\rfloor$ ,然后去验证 $m$ 的正确性,再调整边界。 先考虑二分的本质:假设要猜一个 $[l,r]$ 之间的数,猜测之后会知道是猜大了,猜小了还是刚好。当然可以从 $l$ 枚举到 $r$,但更优秀的方法是二分:猜测答案是$m = \lfloor\frac{l + r}{2}\rfloor$ ,然后去验证 $m$ 的正确性,再调整边界。 回过头来,对于当前的所有询问,可以去猜测所有询问的答案都是 $mid$,然后去依次验证每个询问的答案应该是小于等于 $mid$ 的还是大于 $mid$ 的,并将询问分为两个部分(不大于/大于),对于每个部分继续二分。注意:如果一个询问的答案是大于 $mid$ 的,则在将其划至右侧前需更新它的 $k$,即,如果当前数列中小于等于 $mid$ 的数有 $t$ 个,则将询问划分后实际是在右区间询问第 $k - t$ 小数。如果一个部分的 $l = r$ 了,则结束这个部分的二分。 Loading Loading @@ -218,7 +218,7 @@ void solve( int l, int r, int L, int R ) } ``` ### 参考习题 ### 参考习题 [「国家集训队」 矩阵乘法 ](https://www.luogu.org/problemnew/show/P1527) Loading