Unverified Commit 03db60e2 authored by ir1d's avatar ir1d Committed by GitHub
Browse files

Update index.md (#1347)

Update index.md
parents e3eeaf6d 6f5299fb
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -44,15 +44,15 @@

比如在图论中借助连通分量,数论中借助模方程的分析,借助不等式的放缩来估计下界等等。

## meet-in-middle 分治
## meet-in-middle

也称折半搜索,主要思想是分治,通过将枚举量减少到原来的一半和特殊的合并技巧以使情况数减少到原来的 sqrt,复杂度也就开了个方,折半搜索也是一个很好的优化,往往能在 OI 竞赛中获得出人意料的效果(尤其在面对数据水的时候)

所谓 **meet-in-middle** , 就是让 dfs 的状态在中间的时候碰面。我们知道,如果一个暴力 dfs 有 $K$ 个转移,那么它的时间复杂度(大多数情况)是 $O(K^N)$ 的。那我们就想,当 $N$ 到达一定程度时,TLE 会变成必然。
所谓 **meet-in-middle** , 就是让 DFS 的状态在中间的时候碰面。我们知道,如果一个暴力 dfs 有 $K$ 个转移,那么它的时间复杂度(大多数情况)是 $O(K^N)$ 的。那我们就想,当 $N$ 到达一定程度时,TLE 会变成必然。

例题 [Luogu P2962\[USACO09NOV\]灯 Lights](https://www.luogu.org/problemnew/show/P2962)
例题 [Luogu P2962](https://www.luogu.org/problemnew/show/P2962)

我们正常想,如果这道题暴力 DFS 找开关灯的状态,时间复杂度就是 $O(2^{35})$ , 显然超时。不过,如果我们用 **meet-in-middle** 的话,时间复杂度将会变为 $O(2^{18} \times 2)$ 而已。 **meet-in-middle** 就是让我们先找一半的状态,也就是 $1$ 到 $mid$ ( $N$ 的一半)的状态,再找剩下的状态就可以了。我们把前半段的状态全部存储在 $hash$ 表或者 $map$ 里面,然后在找后半段的状态的时候,先判断后半段是不是都合法,就可以判断上半段有没有配对的上半段使得整段合法。
我们正常想,如果这道题暴力 DFS 找开关灯的状态,时间复杂度就是 $O(2^{n})$ , 显然超时。不过,如果我们用 **meet-in-middle** 的话,时间复杂度将会变为 $O(2^{n/2} \times 2)$ 而已。 **meet-in-middle** 就是让我们先找一半的状态,也就是 $1$ 到 $\mathrm{mid}$ 的状态,再找剩下的状态就可以了。我们把前半段的状态全部存储在`map`里面,然后在找后半段的状态的时候,先判断后半段是不是都合法,就可以判断上半段有没有配对的上半段使得整段合法。

## 经典题目