Loading docs/basic/sort.md +1 −1 Original line number Diff line number Diff line Loading @@ -185,7 +185,7 @@ std::sort(a, a + n); ### 线性找第 k 大的数 找第 k 大的数,最简单的方法是先排序,然后直接找到第 k 大的位置的元素。这样做的时间复杂度是 $O(N\log N)$ ,对于这个问题来说很不划算。事实上,我们有 $O(n)$ 的解法。 找第 k 大的数(K-th order statistic),最简单的方法是先排序,然后直接找到第 k 大的位置的元素。这样做的时间复杂度是 $O(N\log N)$ ,对于这个问题来说很不划算。事实上,我们有 $O(n)$ 的解法。 考虑快速排序的划分过程,在快速排序的“划分”结束后,数列 $A[p \cdots r]]$ 被分成了 $A[p \cdots q]$ 和 $A[q+1 \cdots r]$ ,此时可以按照左边元素的个数( $q - p + 1$ )和 k 的大小关系来判断是只在左边还是只在右边递归地求解。 Loading docs/graph/traverse.md +1 −1 Original line number Diff line number Diff line Loading @@ -28,7 +28,7 @@ DFS 进入某个节点的时候记录一个左括号 `(` ,退出某个节点 在 DFS 过程中,通过记录每个节点从哪个点访问而来,可以建立一个树结构,称为 DFS 树。DFS 树是原图的一个生成树。 DFS 树有很多性质,比如用来求[强连通分量](/graph/scc) DFS 树有很多[性质](/graph/scc/#dfs),比如用来求[强连通分量](/graph/scc) ## BFS Loading docs/search/index.md +5 −0 Original line number Diff line number Diff line Loading @@ -53,3 +53,8 @@ 例题[luogu P2962\[USACO09NOV\]灯 Lights](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$ 里面,然后在找后半段的状态的时候,先判断后半段是不是都合法,就可以判断上半段有没有配对的上半段使得整段合法。 ## 经典题目 - [\[kuangbin 带你飞\] 专题一 简单搜索](https://vjudge.net/contest/65959) - [\[kuangbin 带你飞\] 专题二 搜索进阶](https://vjudge.net/contest/65997) Loading
docs/basic/sort.md +1 −1 Original line number Diff line number Diff line Loading @@ -185,7 +185,7 @@ std::sort(a, a + n); ### 线性找第 k 大的数 找第 k 大的数,最简单的方法是先排序,然后直接找到第 k 大的位置的元素。这样做的时间复杂度是 $O(N\log N)$ ,对于这个问题来说很不划算。事实上,我们有 $O(n)$ 的解法。 找第 k 大的数(K-th order statistic),最简单的方法是先排序,然后直接找到第 k 大的位置的元素。这样做的时间复杂度是 $O(N\log N)$ ,对于这个问题来说很不划算。事实上,我们有 $O(n)$ 的解法。 考虑快速排序的划分过程,在快速排序的“划分”结束后,数列 $A[p \cdots r]]$ 被分成了 $A[p \cdots q]$ 和 $A[q+1 \cdots r]$ ,此时可以按照左边元素的个数( $q - p + 1$ )和 k 的大小关系来判断是只在左边还是只在右边递归地求解。 Loading
docs/graph/traverse.md +1 −1 Original line number Diff line number Diff line Loading @@ -28,7 +28,7 @@ DFS 进入某个节点的时候记录一个左括号 `(` ,退出某个节点 在 DFS 过程中,通过记录每个节点从哪个点访问而来,可以建立一个树结构,称为 DFS 树。DFS 树是原图的一个生成树。 DFS 树有很多性质,比如用来求[强连通分量](/graph/scc) DFS 树有很多[性质](/graph/scc/#dfs),比如用来求[强连通分量](/graph/scc) ## BFS Loading
docs/search/index.md +5 −0 Original line number Diff line number Diff line Loading @@ -53,3 +53,8 @@ 例题[luogu P2962\[USACO09NOV\]灯 Lights](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$ 里面,然后在找后半段的状态的时候,先判断后半段是不是都合法,就可以判断上半段有没有配对的上半段使得整段合法。 ## 经典题目 - [\[kuangbin 带你飞\] 专题一 简单搜索](https://vjudge.net/contest/65959) - [\[kuangbin 带你飞\] 专题二 搜索进阶](https://vjudge.net/contest/65997)