Unverified Commit 25211ffb authored by Prurite's avatar Prurite Committed by GitHub
Browse files

Add more detailed explaination

添加对于整体二分更详细的阐述
parent df188c15
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@

### 查询第k小:一次二分多个询问

> **题1** 在一个数列中查询第 $k$ 小的数。
> **题1** 在一个数列中查询第 $k$ 小的数。

当然可以直接排序。如果用二分法呢?可以用数据结构记录每个大小范围内有多少个数,然后用二分法猜测,利用数据结构检验。

@@ -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$ 了,则结束这个部分的二分。

@@ -218,7 +218,7 @@ void solve( int l, int r, int L, int R )
}
```

### 参考习题
### 参考习题

[「国家集训队」 矩阵乘法 ](https://www.luogu.org/problemnew/show/P1527)