From 5b8ca7a96175170dcffe889b34834d7e2fdb823e Mon Sep 17 00:00:00 2001 From: 24OI-bot <15963390+24OI-bot@users.noreply.github.com> Date: Fri, 8 Feb 2019 21:27:48 +0800 Subject: [PATCH] style: format markdown files with remark-lint --- docs/basic/binary.md | 2 +- docs/basic/expression.md | 2 +- docs/basic/file-operation.md | 2 +- docs/basic/greedy.md | 10 +- docs/basic/sort.md | 6 +- docs/dp/index.md | 12 +- docs/dp/interval.md | 12 +- docs/dp/memo.md | 24 +- docs/dp/number.md | 6 +- docs/dp/optimization.md | 16 +- docs/ds/balanced-in-seg.md | 4 +- docs/ds/bit.md | 8 +- docs/ds/dividing.md | 6 +- docs/ds/dsu.md | 6 +- docs/ds/pb-ds/index.md | 2 +- docs/ds/persistent-balanced.md | 42 +- docs/ds/persistent-in-bit.md | 6 +- docs/ds/persistent-seg.md | 4 +- docs/ds/scapegoat.md | 4 +- docs/ds/seg-in-seg.md | 2 +- docs/ds/segment.md | 12 +- docs/ds/sparse-table.md | 8 +- docs/ds/splay.md | 4 +- docs/ds/stl.md | 20 +- docs/ds/stl/bitset.md | 6 +- docs/ds/stl/vector.md | 4 +- docs/ds/virtual-tree.md | 14 +- docs/geometry/2d.md | 12 +- docs/geometry/convex-hull.md | 6 +- docs/geometry/pick.md | 6 +- docs/graph/2-sat.md | 2 +- docs/graph/bcc.md | 16 +- docs/graph/differential-constraints.md | 2 +- docs/graph/flow/max-flow.md | 14 +- docs/graph/flow/node.md | 2 +- docs/graph/heavy-light-decomposition.md | 26 +- docs/graph/index.md | 8 +- docs/graph/lca.md | 4 +- docs/graph/mst.md | 4 +- docs/graph/shortest-path.md | 4 +- docs/graph/tree-basic.md | 44 +- docs/index.md | 8 +- docs/intro/about.md | 18 +- docs/intro/docker-deploy.md | 2 +- docs/intro/editors.md | 10 +- docs/intro/faq.md | 24 +- docs/intro/judgers.md | 6 +- docs/intro/non-traditional.md | 4 +- docs/intro/spj.md | 4 +- docs/intro/testlib/checker.md | 6 +- docs/intro/testlib/general.md | 2 +- docs/intro/testlib/generator.md | 4 +- docs/intro/testlib/index.md | 2 +- docs/intro/testlib/validator.md | 2 +- docs/intro/wsl.md | 20 +- docs/math/bignum.md | 2 +- docs/math/bsgs.md | 26 +- docs/math/cantor.md | 6 +- docs/math/combination.md | 14 +- docs/math/complex.md | 24 +- docs/math/crt.md | 16 +- docs/math/du-sieves.md | 10 +- docs/math/expectation.md | 18 +- docs/math/game-theory.md | 6 +- docs/math/lagrange-poly.md | 2 +- docs/math/linear-equation.md | 2 +- docs/math/misc.md | 58 +- docs/math/mobius.md | 24 +- docs/math/sieve.md | 4 +- docs/misc/cdq-divide.md | 42 +- docs/misc/complexity.md | 2 +- docs/misc/dsu-on-tree.md | 6 +- docs/misc/endianness.md | 4 +- docs/misc/fractional-programming.md | 2 +- docs/misc/hill-climbing.md | 2 +- docs/misc/io.md | 2 +- docs/misc/magic.md | 2 +- docs/misc/matrix-tree.md | 20 +- docs/misc/mo-algo.md | 4 +- docs/misc/odt.md | 2 +- docs/misc/simulated-annealing.md | 4 +- docs/search/astar.md | 4 +- docs/search/bfs.md | 2 +- docs/search/idastar.md | 14 +- docs/search/index.md | 4 +- docs/search/iterative.md | 2 +- docs/search/optimization.md | 6 +- docs/string/manacher.md | 14 +- docs/string/prefix-function.md | 12 +- docs/string/sa.md | 6 +- docs/string/sam.md | 90 +- docs/string/z-function.md | 26 +- package-lock.json | 2594 +++++++++++++++---------------- 93 files changed, 1792 insertions(+), 1792 deletions(-) diff --git a/docs/basic/binary.md b/docs/basic/binary.md index c684aae0..bf40c721 100644 --- a/docs/basic/binary.md +++ b/docs/basic/binary.md @@ -59,7 +59,7 @@ int binary_search(int start, int end, int key) { 解题的时候往往会考虑枚举答案然后检验枚举的值是否正确。如果我们把这里的枚举换成二分,就变成了“二分答案”。 -来看一看一道例题[Luogu P1873 砍树](https://www.luogu.org/problemnew/show/P1873),我们可以从 1 到 1000000000(10 亿)来枚举答案,但是这种朴素写法肯定拿不到满分,因为从 1 跑到 10 亿太耗时间。我们可以对答案进行 1 到 10 亿的二分,其中,每次都对其进行检查可行性(一般都是使用贪心法)。**这就是二分答案。** +来看一看一道例题[Luogu P1873 砍树](https://www.luogu.org/problemnew/show/P1873),我们可以从 1 到 1000000000(10 亿)来枚举答案,但是这种朴素写法肯定拿不到满分,因为从 1 跑到 10 亿太耗时间。我们可以对答案进行 1 到 10 亿的二分,其中,每次都对其进行检查可行性(一般都是使用贪心法)。 **这就是二分答案。** 下面就是例题的参考答案。 diff --git a/docs/basic/expression.md b/docs/basic/expression.md index e0c0e04b..8b90746a 100644 --- a/docs/basic/expression.md +++ b/docs/basic/expression.md @@ -18,7 +18,7 @@ 非递归的方法是定义两个[栈](/stack/)来分别存储运算符和运算数。每当遇到一个数直接放进数的栈;每当遇到一个操作符时,要查找之前运算符栈中的元素,按照预先定义好的优先级来进行适当的弹出操作(弹出的同时求出对应的子表达式的值)。 -我们要知道:算术表达式分为三种,分别是前缀表达式、中缀表达式、后缀表达式。其中,中缀表达式是我们日常生活中最常用的表达式;后缀表达式是计算机最容易理解的表达式。为什么说后缀表达式最容易被计算机理解呢?因为后缀表达式不需要括号表示,它的运算顺序是唯一确定的。举个例子:在后缀表达式 $3 2 * 1 -$ 中,首先计算 $3 \times 2 = 6$ (使用最后一个运算符,即栈顶运算符),然后计算 $6 - 1 = 5$ 。可以看到:对于一个后缀表达式,只需要**维护一个数字栈,每次遇到一个运算符,就取出两个栈顶元素,将运算结果重新压入栈中**。最后,栈中唯一一个元素就是改后缀表达式的运算结果时间复杂度 $O(n)$ 。 +我们要知道:算术表达式分为三种,分别是前缀表达式、中缀表达式、后缀表达式。其中,中缀表达式是我们日常生活中最常用的表达式;后缀表达式是计算机最容易理解的表达式。为什么说后缀表达式最容易被计算机理解呢?因为后缀表达式不需要括号表示,它的运算顺序是唯一确定的。举个例子:在后缀表达式 $3 2 * 1 -$ 中,首先计算 $3 \times 2 = 6$ (使用最后一个运算符,即栈顶运算符),然后计算 $6 - 1 = 5$ 。可以看到:对于一个后缀表达式,只需要 **维护一个数字栈,每次遇到一个运算符,就取出两个栈顶元素,将运算结果重新压入栈中** 。最后,栈中唯一一个元素就是改后缀表达式的运算结果时间复杂度 $O(n)$ 。 所以说,对于普通中缀表达式的计算,我们可以将其转化为后缀表达式再进行计算。转换方法也十分简单。只要建立一个用于存放运算符的栈,扫描该中缀表达式: diff --git a/docs/basic/file-operation.md b/docs/basic/file-operation.md index 80c27ca5..068a0972 100644 --- a/docs/basic/file-operation.md +++ b/docs/basic/file-operation.md @@ -1,6 +1,6 @@ ## 文件的概念 -文件是根据特定的目的而收集在一起的有关数据的集合。C/C++ 把每一个文件都看成是一个有序的字节流,每个文件都是以**文件结束标志**(EOF)结束,如果要操作某个文件,程序应该首先打开该文件,每当一个文件被打开后(请记得关闭打开的文件),该文件就和一个流关联起来,这里的流实际上是一个字节序列。 +文件是根据特定的目的而收集在一起的有关数据的集合。C/C++ 把每一个文件都看成是一个有序的字节流,每个文件都是以 **文件结束标志** (EOF)结束,如果要操作某个文件,程序应该首先打开该文件,每当一个文件被打开后(请记得关闭打开的文件),该文件就和一个流关联起来,这里的流实际上是一个字节序列。 C/C++ 将文件分为文本文件和二进制文件。文本文件就是简单的文本文件(重点),另外二进制文件就是特殊格式的文件或者可执行代码文件等。 ## 文件的操作步骤 diff --git a/docs/basic/greedy.md b/docs/basic/greedy.md index c3d0de07..5f3d84dd 100644 --- a/docs/basic/greedy.md +++ b/docs/basic/greedy.md @@ -1,6 +1,6 @@ 贪心算法顾名思义就是用计算机来模拟一个“贪心”的人做出决策的过程。 -这个人每一步行动总是按某种指标选取最优的操作,他总是**只看眼前,并不考虑以后可能造成的影响**。 +这个人每一步行动总是按某种指标选取最优的操作,他总是 **只看眼前,并不考虑以后可能造成的影响** 。 可想而知,并不是所有的时候贪心法都能获得最优解,所以一般使用贪心法的时候,都要确保自己能证明其正确性。 @@ -25,7 +25,7 @@ 有些题的排序方法非常显然,如[luogu P1209](https://www.luogu.org/problemnew/show/P1209)就是将输入数组差分后排序模拟求值。 -然而有些时候很难直接一下子看出排序方法,比如[luogu P1080](https://www.luogu.org/problemnew/show/P1080)就很容易凭直觉而错误地以 $a$ 或 $b$ 为关键字排序,过样例之后提交就发现 WA 了 QAQ。一个~~众所周知的~~常见办法就是尝试交换数组相邻的两个元素来**推导**出正确的排序方法。我们假设这题输入的俩个数用一个结构体来保存 +然而有些时候很难直接一下子看出排序方法,比如[luogu P1080](https://www.luogu.org/problemnew/show/P1080)就很容易凭直觉而错误地以 $a$ 或 $b$ 为关键字排序,过样例之后提交就发现 WA 了 QAQ。一个~~众所周知的~~常见办法就是尝试交换数组相邻的两个元素来 **推导** 出正确的排序方法。我们假设这题输入的俩个数用一个结构体来保存 ```c++ struct { @@ -94,10 +94,10 @@ struct uv { 贪心思想: -- **1**. 先假设每一项工作都做,将各项工作按截止时间排序后入队。 -- **2**. 在判断第 i 项工作做与不做时,若其截至时间符合条件,则将其与队中报酬最小的元素比较,若第 i 项工作报酬较高(后悔),则 ans+=a[i].p-q.top()。 +- **1** . 先假设每一项工作都做,将各项工作按截止时间排序后入队。 +- **2** . 在判断第 i 项工作做与不做时,若其截至时间符合条件,则将其与队中报酬最小的元素比较,若第 i 项工作报酬较高(后悔),则 ans+=a[i].p-q.top()。 -**PS**:用优先队列(小根堆)来维护队首元素最小。 + **PS** :用优先队列(小根堆)来维护队首元素最小。 ### Code diff --git a/docs/basic/sort.md b/docs/basic/sort.md index f4ca1ea8..2fc232dc 100644 --- a/docs/basic/sort.md +++ b/docs/basic/sort.md @@ -90,7 +90,7 @@ Shell 排序的复杂度和间距序列的选取(就是间距如何减小到 1 不难发现,归并排序的核心是如何合并两个子序列,前两步都很好实现。 -其实合并的时候也不难操作。注意到两个子序列在第二步中已经保证了都是有序的了,第三步中实际上是想要把两个**有序**数列合并起来。 +其实合并的时候也不难操作。注意到两个子序列在第二步中已经保证了都是有序的了,第三步中实际上是想要把两个 **有序** 数列合并起来。 ```c++ void merge(int ll, int rr) { @@ -167,7 +167,7 @@ C 函数模板库实现了快速排序,即 `stdlib.h` 当中的 `qsort` 。 C++ 标准并未严格要求此函数的实现算法,具体实现取决于编译器。 -旧版 C++ 标准中仅要求它的**平均**时间复杂度是 $O(N\log N)$ 的,但在 C++11 中要求它的**最坏**时间复杂度是 $O(N\log N)$ 的。可以查阅[std::sort()](https://en.cppreference.com/w/cpp/algorithm/sort) +旧版 C++ 标准中仅要求它的 **平均** 时间复杂度是 $O(N\log N)$ 的,但在 C++11 中要求它的 **最坏** 时间复杂度是 $O(N\log N)$ 的。可以查阅[std::sort()](https://en.cppreference.com/w/cpp/algorithm/sort) 在[libstdc++](https://github.com/mirrors/gcc/blob/master/libstdc++-v3/include/bits/stl_algo.h)和[libc++](http://llvm.org/svn/llvm-project/libcxx/trunk/include/algorithm)中使用的都是[Introsort](https://en.wikipedia.org/wiki/Introsort)。 @@ -202,7 +202,7 @@ std::sort(a, a + n); 计数排序也称桶排序,可以在 $O(n)$ 的时间内排序,但是它要求所有的数都出现在一定的范围内。 !!! warning "注" - 注意区分**基数排序** + 注意区分 **基数排序** 算法流程顾名思义,就是记录每一个数出现了多少次,然后从小到大依次输出。 diff --git a/docs/dp/index.md b/docs/dp/index.md index 536f8a0f..7bbffa68 100644 --- a/docs/dp/index.md +++ b/docs/dp/index.md @@ -56,10 +56,10 @@ 子问题图中每个定点对应一个子问题,而需要考察的选择对应关联至子问题顶点的边。 -**经典问题:** + **经典问题:** -- **无权最短路径:**具有最优子结构性质。 -- **无权最长(简单)路径:**此问题不具有,是 NPC 的。区别在于,要保证子问题无关,即同一个原问题的一个子问题的解不影响另一个子问题的解。相关:求解一个子问题时用到了某些资源,导致这些资源在求解其他子问题时不可用。 +- **无权最短路径:** 具有最优子结构性质。 +- **无权最长(简单)路径:** 此问题不具有,是 NPC 的。区别在于,要保证子问题无关,即同一个原问题的一个子问题的解不影响另一个子问题的解。相关:求解一个子问题时用到了某些资源,导致这些资源在求解其他子问题时不可用。 ### 子问题重叠 @@ -140,13 +140,13 @@ int dp() { 初始化: $d_1=a_1,len=1$ 。 -现在我们已知最长的不下降子序列长度为 1,那么我们让 $i$ 从 2 到 $n$ 循环,依次求出前 $i$ 个元素的最长不下降子序列的长度,循环的时候我们只需要维护好 $d$ 这个数组还有 $len$ 就可以了。**关键在于如何维护。** +现在我们已知最长的不下降子序列长度为 1,那么我们让 $i$ 从 2 到 $n$ 循环,依次求出前 $i$ 个元素的最长不下降子序列的长度,循环的时候我们只需要维护好 $d$ 这个数组还有 $len$ 就可以了。 **关键在于如何维护。** 考虑进来一个元素 $a_i$ : 1. 元素大于 $d_{len}$ ,直接 $d_{++len}=a_i$ 即可,这个比较好理解。 2. 元素等于 $d_{len}$ ,因为前面的元素都小于它,所以这个元素可以直接抛弃。 -3. 元素小于 $d_{len}$ ,找到**第一个**大于它的元素,插入进去,其他小于它的元素不要。 +3. 元素小于 $d_{len}$ ,找到 **第一个** 大于它的元素,插入进去,其他小于它的元素不要。 那么代码如下: @@ -266,7 +266,7 @@ upd:其实是[程设期末推荐练习](https://ir1d.cf/2018/06/23/cssx/程设 希望最小化所有行的额外空格数的立方之和。 -注意到实际问题要求单词不能打乱顺序,所以就好做了起来。**不要把题目看复杂。** +注意到实际问题要求单词不能打乱顺序,所以就好做了起来。 **不要把题目看复杂。** $dp[i] = \min(dp[j] + cost[j][i])$ diff --git a/docs/dp/interval.md b/docs/dp/interval.md index 0b9edd91..a8f2aa53 100644 --- a/docs/dp/interval.md +++ b/docs/dp/interval.md @@ -4,11 +4,11 @@ 区间 DP 的特点: -**合并**:即将两个或多个部分进行整合,当然也可以反过来; + **合并** :即将两个或多个部分进行整合,当然也可以反过来; -**特征**:能将问题分解为能两两合并的形式; + **特征** :能将问题分解为能两两合并的形式; -**求解**:对整个问题设最优值,枚举合并点,将问题分解为左右两个部分,最后合并两个部分的最优值得到原问题的最优值。 + **求解** :对整个问题设最优值,枚举合并点,将问题分解为左右两个部分,最后合并两个部分的最优值得到原问题的最优值。 ??? note " 例题[洛谷 P1880\[NOI1995\]石子合并](https://www.luogu.org/problemnew/show/P1880)" 题目大意:在一个环上有 $n$ 个数 $a_1,a_2,...,a_n$ ,进行 $n-1$ 次合并操作,每次操作将相邻的两堆合并成一堆,能获得新的一堆中的石子数量的和的得分。你需要最大化你的得分。 @@ -17,7 +17,7 @@ 令 $f(i,j)$ 表示将区间 $[i,j]$ 内的所有石子合并到一起的最大得分。 -写出**状态转移方程**: $f(i,j)=max\{f(i,k)+f(k+1,j)+\sum_{t=i}^{j} a_t \}~(i\le k 在时间 $tleft$ 内采集**后** $pos$ 个草药,能获得的最大收益 +> 在时间 $tleft$ 内采集 **后** $pos$ 个草药,能获得的最大收益 这能 ac ? -能。**这就是 "采药" 那题的 AC 代码** +能。 **这就是 "采药" 那题的 AC 代码** 好我们 yy 出了记忆化搜索 #### 总结一下记忆化搜索是啥: -- 不依赖任何**外部变量** +- 不依赖任何 **外部变量** - 答案以返回值的形式存在,而不能以参数的形式存在(就是不能将 dfs 定义成 $dfs(pos ,tleft , nowans )$ , 这里面的 nowans 不符合要求)。 - 对于相同一组参数,dfs 返回值总是相同的 @@ -129,7 +129,7 @@ int main() { 不信你看 $mem$ 的意义: -> 在时间 $tleft$ 内采集**后** $pos$ 个草药,能获得的最大收益 +> 在时间 $tleft$ 内采集 **后** $pos$ 个草药,能获得的最大收益 这不就是 dp 的状态? @@ -141,9 +141,9 @@ int main() { 个人认为: -> 记忆化搜索约等于动态规划,**(印象中)任何一个 dp 方程都能转为记忆化搜索** +> 记忆化搜索约等于动态规划, **(印象中)任何一个 dp 方程都能转为记忆化搜索** -大部分记忆化搜索的状态/转移方程与 dp 都一样,时间复杂度/空间复杂度与**不加优化的**dp 完全相同 +大部分记忆化搜索的状态/转移方程与 dp 都一样,时间复杂度/空间复杂度与 **不加优化的** dp 完全相同 比如: @@ -211,7 +211,7 @@ int main() { - 记忆化搜索可以避免搜到无用状态,特别是在有状态压缩时 -举例:给你一个有向图(注意不是完全图),经过每条边都有花费,求从点 1 出发,经过每个点**恰好一次**后的最小花费(最后不用回到起点),保证路径存在。 +举例:给你一个有向图(注意不是完全图),经过每条边都有花费,求从点 1 出发,经过每个点 **恰好一次** 后的最小花费(最后不用回到起点),保证路径存在。 dp 状态很显然: diff --git a/docs/dp/number.md b/docs/dp/number.md index 8a709f68..3e2ed3a5 100644 --- a/docs/dp/number.md +++ b/docs/dp/number.md @@ -1,9 +1,9 @@ ## 经典题型 -数位 DP 问题往往都是这样的题型,给定一个闭区间 $[l,r]$ ,让你求这个区间中满足**某种条件**的数的总数。 +数位 DP 问题往往都是这样的题型,给定一个闭区间 $[l,r]$ ,让你求这个区间中满足 **某种条件** 的数的总数。 ??? note " 例题[洛谷 P2657\[SCOI2009\]windy 数](https://www.luogu.org/problemnew/show/P2657)" - 题目大意:给定一个区间 $[l,r]$ ,求其中满足条件**不含前导 $0$ 且相邻两个数字相差至少为 $2$ **的数字个数。 + 题目大意:给定一个区间 $[l,r]$ ,求其中满足条件 **不含前导 $0$ 且相邻两个数字相差至少为 $2$ ** 的数字个数。 首先我们将问题转化成更加简单的形式。设 $ans_i$ 表示在区间 $[1,i]$ 中满足条件的数的数量,那么所求的答案就是 $ans_r-ans_{l-1}$ 。 @@ -13,7 +13,7 @@ 有了这个性质,我们可以定义 $f(i,st,op)$ 表示当前将要考虑的是从高到低的第 $i$ 位,当前该前缀的状态为 $st$ 且前缀和当前求解的数字的大小关系是 $op$ ( $op=1$ 表示等于, $op=0$ 表示小于)时的数字个数。在本题中,这个前缀的状态就是上一位的值,因为当前将要确定的位不能取哪些数只和上一位有关。在其他题目中,这个值可以是:前缀的数字和,前缀所有数字的 $\gcd$ ,该前缀取模某个数的余数,也有两种或多种合用的情况。 -写出**状态转移方程**: $f(i,st,op)=\sum_{i=1}^{maxx} f(i+1,k,op=1~ \operatorname{and}~ i=maxx )\quad (|st-k|\ge 2)$ +写出 **状态转移方程** : $f(i,st,op)=\sum_{i=1}^{maxx} f(i+1,k,op=1~ \operatorname{and}~ i=maxx )\quad (|st-k|\ge 2)$ 这里的 $k$ 就是当前枚举的下一位的值,而 $maxx$ 就是当前能取到的最高位。因为如果 $op=1$ ,那么你在这一位上取的值一定不能大于求解的数字上该位的值,否则则没有限制。 diff --git a/docs/dp/optimization.md b/docs/dp/optimization.md index 34bf5622..31d7f73b 100644 --- a/docs/dp/optimization.md +++ b/docs/dp/optimization.md @@ -1,4 +1,4 @@ -本章主要讲解动态规划的几种基础**优化**方法。 +本章主要讲解动态规划的几种基础 **优化** 方法。 ## 二进制优化解多重背包 @@ -9,7 +9,7 @@ 状态转移方程为, $f_{i,j}=\max\{f_{i-1,j},f_{i-1,j-c_i}+v_i\}$ 。 -对于**每件**物品,都要这样循环一次,时间复杂度为 $t\times \sum_{i=1}^n a_i$ ,某些时候可能不可接受,需要优化。 +对于 **每件** 物品,都要这样循环一次,时间复杂度为 $t\times \sum_{i=1}^n a_i$ ,某些时候可能不可接受,需要优化。 考虑这样一种情况,如果我们有 $17$ 个硬币,要去买 $1$ 到 $17$ 元钱的物品,只需将这些硬币打包成 $1,2,4,8$ 和 $2$ 这样的几包。前面的 $4$ 包能保证覆盖 $1$ 到 $15$ 所有的情况,最后一包在之前的基础上再加上一个值,能保证实现支付的时候取整包,肯定能保证支付。这就是二进制优化的原理和基本思想。 @@ -44,7 +44,7 @@ for (int i = 1; i <= cur; i++) 设 $f_{i,j}$ 表示在放第 $i$ 个烟花时,你的位置在 $j$ 所能获得的最大快乐值。 -写出**状态转移方程**: $f_{i,j}=\max\{f_{i-1,k}+b_i-|a_i-j|\}$ +写出 **状态转移方程** : $f_{i,j}=\max\{f_{i-1,k}+b_i-|a_i-j|\}$ 这里的 $k$ 是有范围的, $j-(t_{i+1}-t_i)\times d\le k\le j+(t_{i+1}-t_i)\times d$ 。 @@ -58,7 +58,7 @@ for (int i = 1; i <= cur; i++) 最后,式子变成了这个样子: $f_{i,j}=\max\{f_{i-1,k}-|a_i-j|\}+b_i=\max\{f_{i-1,k}\}-|a_i-j|+b_i$ -看到这一熟悉的形式,我们想到了什么?**单调队列优化**。由于最终式子中的 $\max$ 只和上一状态中连续的一段的最大值有关,所以我们在计算一个新的 $i$ 的状态值时候只需将原来的 $f_{i-1}$ 构造成一个单调队列,并维护单调队列,使得其能在均摊 $O(1)$ 的时间复杂度内计算出 $\max\{f_{i-1,k}\}$ 的值,从而根据公式计算出 $f_{i,j}$ 的值。 +看到这一熟悉的形式,我们想到了什么? **单调队列优化** 。由于最终式子中的 $\max$ 只和上一状态中连续的一段的最大值有关,所以我们在计算一个新的 $i$ 的状态值时候只需将原来的 $f_{i-1}$ 构造成一个单调队列,并维护单调队列,使得其能在均摊 $O(1)$ 的时间复杂度内计算出 $\max\{f_{i-1,k}\}$ 的值,从而根据公式计算出 $f_{i,j}$ 的值。 总的时间复杂度为 $O(n\times m)$ 。 @@ -77,7 +77,7 @@ for (int i = 1; i <= cur; i++) ??? note " 例题[洛谷 P3195\[HNOI2008\]玩具装箱 TOY](https://www.luogu.org/problemnew/show/P3195)" 令 $f_i$ 表示前 $i$ 个物品,随意分组装在任意多个容器里所能得到的最小费用。 -写出**状态转移方程**: $f_i=max\{f_j+(pre_i-pre_i+i-j-1-L)^2\}$ ,其中 $pre_i$ 表示前 $i$ 个数的前缀和。 +写出 **状态转移方程** : $f_i=max\{f_j+(pre_i-pre_i+i-j-1-L)^2\}$ ,其中 $pre_i$ 表示前 $i$ 个数的前缀和。 换元试图简化状态转移方程式:令 $s_i=pre_i+i,L'=L+1$ ,则 $f_i=f_j+(s_i-s_j-L')^2$ ,展开,移项得 @@ -89,7 +89,7 @@ for (int i = 1; i <= cur; i++) ![](./images/optimization.png) -如图,我们将这个斜率固定的直线从下往上平移,直到有一个点在这条直线上,然后将新的点加入点集,这样肯定能保证所有的直线的斜率都是单调递升的(因为如果新的直线斜率小于斜率最大的直线,那么其一定不成被选择成为新的决策),所以我们相当于维护了一个下凸包。(如果求的是 $\max$ 那么就要维护一个**上凸包**。这种东西要具体情况具体分析,如果直线的斜率不满足单调性,那就要维护整个凸包/二分等奇技淫巧。) +如图,我们将这个斜率固定的直线从下往上平移,直到有一个点在这条直线上,然后将新的点加入点集,这样肯定能保证所有的直线的斜率都是单调递升的(因为如果新的直线斜率小于斜率最大的直线,那么其一定不成被选择成为新的决策),所以我们相当于维护了一个下凸包。(如果求的是 $\max$ 那么就要维护一个 **上凸包** 。这种东西要具体情况具体分析,如果直线的斜率不满足单调性,那就要维护整个凸包/二分等奇技淫巧。) 可以用单调队列维护下凸包。 @@ -112,9 +112,9 @@ for (int i = 1; i <= cur; i++) ??? note " 例题[洛谷 P1880\[NOI1995\]石子合并](https://www.luogu.org/problemnew/show/P1880)" 题目大意:在一个环上有 $n$ 个数,进行 $n-1$ 次合并操作,每次操作将相邻的两堆合并成一堆,能获得新的一堆中的石子数量的和的得分。你需要最大化你的得分。 -我们首先**破环成链**,然后进行动态规划。设 $f_{i,j}$ 表示从位置 $i$ 合并到位置 $j$ 所能得到的最大得分, $sum_i$ 为前 $i$ 堆石子数的前缀和。 +我们首先 **破环成链** ,然后进行动态规划。设 $f_{i,j}$ 表示从位置 $i$ 合并到位置 $j$ 所能得到的最大得分, $sum_i$ 为前 $i$ 堆石子数的前缀和。 -写出**状态转移方程**: $f_{i,j}=\max\{f_{i,k}+f_{k+1,j}+(sum_j-sum_i)\}(i\le k\le j)$ +写出 **状态转移方程** : $f_{i,j}=\max\{f_{i,k}+f_{k+1,j}+(sum_j-sum_i)\}(i\le k\le j)$ 考虑常规的转移方法,枚举 $i$ 、 $j$ 和 $k$ ,时间复杂度为 $O(n^3)$ 。 diff --git a/docs/ds/balanced-in-seg.md b/docs/ds/balanced-in-seg.md index 2e2a030c..69d4e723 100644 --- a/docs/ds/balanced-in-seg.md +++ b/docs/ds/balanced-in-seg.md @@ -4,7 +4,7 @@ ## 实现原理 -我们以**二逼平衡树**为例,来解释实现原理。 +我们以 **二逼平衡树** 为例,来解释实现原理。 关于树套树的构建,我们对于外层线段树正常建树,对于线段树上的某一个节点,建立一棵平衡树,包含该节点所覆盖的序列。具体操作时我们可以将序列元素一个个插入,每经过一个线段树节点,就将该元素加入到该节点的平衡树中。 @@ -92,4 +92,4 @@ int vec_front(int k, int l, int r, int x, int y, int t) { ## 相关算法 -面对多维度信息的题目时,如果题目没有要求强制在线,我们还可以考虑**CDQ 分治**,或者**整体二分**等分治算法,来避免使用高级数据结构,减少代码实现难度。 +面对多维度信息的题目时,如果题目没有要求强制在线,我们还可以考虑 **CDQ 分治** ,或者 **整体二分** 等分治算法,来避免使用高级数据结构,减少代码实现难度。 diff --git a/docs/ds/bit.md b/docs/ds/bit.md index 3dede5e9..7244082e 100644 --- a/docs/ds/bit.md +++ b/docs/ds/bit.md @@ -6,7 +6,7 @@ 树状数组能有的操作,线段树一定有; 线段树有的操作,树状数组不一定有。 -这么看来选择线段树不就**「得天下了」**? +这么看来选择线段树不就 **「得天下了」** ? 事实上,树状数组的代码要比线段树短得多,思维也更清晰,在解决一些单点修改的问题时,树状数组是不二之选。 @@ -55,7 +55,7 @@ int lowbit(int x) { 这就是 `lowbit` 的用处,仅此而已(但也相当有用)。 -**你可能又问了:x & -x 是什么意思啊?** + **你可能又问了:x & -x 是什么意思啊?** > $-x$ 代表 $x$ 的负数,计算机中负数使用对应的正数的补码来表示。 @@ -66,7 +66,7 @@ int lowbit(int x) { 神奇吧,我也觉得神奇! -那么对于**单点修改**就更轻松了: +那么对于 **单点修改** 就更轻松了: ```cpp void change(int x, int k) { @@ -92,7 +92,7 @@ int getsum(int x) // a[1]……a[x]的和 } ``` -**区间和**也不用说了吧,代码十分清真。 + **区间和** 也不用说了吧,代码十分清真。 ## 例题 diff --git a/docs/ds/dividing.md b/docs/ds/dividing.md index 46e232c1..dfd55aa7 100644 --- a/docs/ds/dividing.md +++ b/docs/ds/dividing.md @@ -1,12 +1,12 @@ 划分树是一种来解决区间第 $K$ 大的一种数据结构,其常数、理解难度都要比主席树低很多。同时,划分树紧贴“第 $K$ 大”,所以是一种基于排序的一种数据结构。 -**建议先学完主席树再看划分树哦** + **建议先学完主席树再看划分树哦** ## 建树 划分树的建树比较简单,但是相对于其他树来说比较复杂。![](./images/dividing1.png) -如图,每一层都有一个看似无序的数组。其实,每一个被红色标记的数字都是**要分配到左儿子的**。而分配的规则是什么?就是与**这一层的中位数**做比较, $\leq$ 左边,否则右边。但是这里要注意一下:并不是严格的 $\leq$ **左边,否则右边**。因为中位数可能有相同,而且与 $N$ 的奇偶有一定关系。下面的代码展示会有一个巧妙的运用,大家可以参照代码。 +如图,每一层都有一个看似无序的数组。其实,每一个被红色标记的数字都是 **要分配到左儿子的** 。而分配的规则是什么?就是与 **这一层的中位数** 做比较, $\leq$ 左边,否则右边。但是这里要注意一下:并不是严格的 $\leq$ **左边,否则右边** 。因为中位数可能有相同,而且与 $N$ 的奇偶有一定关系。下面的代码展示会有一个巧妙的运用,大家可以参照代码。 我们不肯能每一次都对每一层排序,这样子不说常数,就算是理论复杂度也过不去。我们想,找中位数,一次排序就够了。为什么?比如,我们求 $l,r$ 的中位数,其实就是在排完序过后的 $num[mid]$ 。 @@ -55,7 +55,7 @@ end; 那我们先扯一下主席树的内容。在用主席树求区间第 $K$ 小的时候,我们以 $K$ 为基准,向左就向左,向右要减去向左的值,在划分树中也是这样子的。 -查询难理解的,在于**区间缩小**这种东西。下图,我查询的是 $3$ 到 $7$ , 那么下一层我就只需要查询 $2$ 到 $3$ 了。当然,我们定义 $left,right$ 为缩小后的区间(目标区间), $l,r$ 还是我所在节点的区间。那为什么要标出目标区间呢?因为那是**判定答案在左边,右边的基准**。 +查询难理解的,在于 **区间缩小** 这种东西。下图,我查询的是 $3$ 到 $7$ , 那么下一层我就只需要查询 $2$ 到 $3$ 了。当然,我们定义 $left,right$ 为缩小后的区间(目标区间), $l,r$ 还是我所在节点的区间。那为什么要标出目标区间呢?因为那是 **判定答案在左边,右边的基准** 。 ![](./images/dividing2.png) diff --git a/docs/ds/dsu.md b/docs/ds/dsu.md index a92e2889..584cedda 100644 --- a/docs/ds/dsu.md +++ b/docs/ds/dsu.md @@ -1,4 +1,4 @@ -并查集是一种树形的数据结构,顾名思义,它用于处理一些不交集的**合并**及**查询**问题。 +并查集是一种树形的数据结构,顾名思义,它用于处理一些不交集的 **合并** 及 **查询** 问题。 它支持两种操作: - 查找(Find):确定某个元素处于哪个子集; @@ -38,7 +38,7 @@ int find(int x) //寻找x的祖先 ### 路径压缩 -这样的确可以达成目的,但是显然效率实在太低。为什么呢?因为我们使用了太多没用的信息,我关心的是我祖先是谁,我爸爸是谁没什么关系,这样一层一层找太浪费时间,不如我直接当祖先的儿子,问一次就可以出结果了。甚至祖先是谁都无所谓,只要这个人可以代表我们家族就能得到想要的效果。**把在路径上的每个节点都直接连接到根上**,这就是路径压缩。 +这样的确可以达成目的,但是显然效率实在太低。为什么呢?因为我们使用了太多没用的信息,我关心的是我祖先是谁,我爸爸是谁没什么关系,这样一层一层找太浪费时间,不如我直接当祖先的儿子,问一次就可以出结果了。甚至祖先是谁都无所谓,只要这个人可以代表我们家族就能得到想要的效果。 **把在路径上的每个节点都直接连接到根上** ,这就是路径压缩。 于是用代码实现它。 ```cpp @@ -69,7 +69,7 @@ void unionSet(int x, int y) // x与y所在家族合并 一个祖先突然抖了个机灵:「你们家族人比较少,搬家到我们家族里比较方便,我们要是搬过去的话太费事了。」 -启发式合并是将深度小的集合合并到深度大的集合(也称为**按秩合并**),但是笔者认为路径压缩之后它就失去意义了,或者不如按照节点数量合并,这样还可以减少下次路径压缩的工作量。(反正启发式合并用得很少,路径压缩已经够快了。) +启发式合并是将深度小的集合合并到深度大的集合(也称为 **按秩合并** ),但是笔者认为路径压缩之后它就失去意义了,或者不如按照节点数量合并,这样还可以减少下次路径压缩的工作量。(反正启发式合并用得很少,路径压缩已经够快了。) ```cpp int size[N]; //记录子树的大小 diff --git a/docs/ds/pb-ds/index.md b/docs/ds/pb-ds/index.md index 167805b7..658538c1 100644 --- a/docs/ds/pb-ds/index.md +++ b/docs/ds/pb-ds/index.md @@ -6,4 +6,4 @@ pb_ds 库封装了很多数据结构,比如哈希(Hash)表,平衡二叉 pb_ds 只在使用 libstdc++ 为标准库的编译器下可以用。 -**参考资料:《C++ 的 pb_ds 库在 OI 中的应用》** + **参考资料:《C++ 的 pb_ds 库在 OI 中的应用》** diff --git a/docs/ds/persistent-balanced.md b/docs/ds/persistent-balanced.md index 5e927dc9..4c313679 100644 --- a/docs/ds/persistent-balanced.md +++ b/docs/ds/persistent-balanced.md @@ -6,46 +6,46 @@ Split-Merge Treap 看楼上的[Treap 词条](/ds/treap/) -**OI 常用的可持久化平衡树**一般就是**可持久化无旋转 Treap**所以推荐首先学习楼上的**无旋转 Treap** + **OI 常用的可持久化平衡树** 一般就是 **可持久化无旋转 Treap** 所以推荐首先学习楼上的 **无旋转 Treap** ## 思想/做法 我们来看看旋转的 Treap,为什么不能可持久化呢? -如果带旋转,那么就会**破环原有的父子关系**,破环原有的路径和树形态,这是可持久化无法接受的。 +如果带旋转,那么就会 **破环原有的父子关系** ,破环原有的路径和树形态,这是可持久化无法接受的。 -如果把 Treap 变为非旋转的,我们发现可以通过可持久化**Merge**和**Split**操作就可以完成可持久化。 +如果把 Treap 变为非旋转的,我们发现可以通过可持久化 **Merge** 和 **Split** 操作就可以完成可持久化。 -「一切可支持操作都可以通过**Merge Split Newnode Build**完成」,而**Build**操作只用于建造无需理会,**Newnode**(新建节点)就是用来可持久化的工具。 +「一切可支持操作都可以通过 **Merge Split Newnode Build** 完成」,而 **Build** 操作只用于建造无需理会, **Newnode** (新建节点)就是用来可持久化的工具。 -我们来观察一下**Merge**和**Split**,我们会发现它们都是由上而下的操作! +我们来观察一下 **Merge** 和 **Split** ,我们会发现它们都是由上而下的操作! -因此我们完全可以**参考线段树的可持久化操作**对它进行可持久化。 +因此我们完全可以 **参考线段树的可持久化操作** 对它进行可持久化。 ## 可持久化操作 -**可持久化**是对**数据结构**的一种操作,即保留历史信息,使得在后面可以调用之前的历史版本。 + **可持久化** 是对 **数据结构** 的一种操作,即保留历史信息,使得在后面可以调用之前的历史版本。 -对于**可持久化线段树**来说,每一次新建历史版本就是把**沿途的修改路径**复制出来 +对于 **可持久化线段树** 来说,每一次新建历史版本就是把 **沿途的修改路径** 复制出来 那么对可持久化 Treap(目前国内 OI 常用的版本)来说: 在复制一个节点 $X_{a}$ ( $X$ 节点的第 $a$ 个版本)的新版本 $X_{a+1}$ ( $X$ 节点的第 $a+1$ 个版本)以后: - 如果某个儿子节点 $Y$ 不用修改信息,那么就把 $X_{a+1}$ 的指针直接指向 $Y_{a}$ ( $Y$ 节点的第 $a$ 个版本)即可。 -- 反之,如果要修改 $Y$ ,那么就在**递归到下层**时**新建** $Y_{a+1}$ ( $Y$ 节点的第 $a+1$ 个版本)这个新节点用于**存储新的信息**,同时把 $X_{a+1}$ 的指针指向 $Y_{a+1}$ ( $Y$ 节点的第 $a+1$ 个版本)。 +- 反之,如果要修改 $Y$ ,那么就在 **递归到下层** 时 **新建** $Y_{a+1}$ ( $Y$ 节点的第 $a+1$ 个版本)这个新节点用于 **存储新的信息** ,同时把 $X_{a+1}$ 的指针指向 $Y_{a+1}$ ( $Y$ 节点的第 $a+1$ 个版本)。 ## 可持久化 需要的东西: -- 一个 struct 数组 存**每个节点**的信息(一般叫做 tree 数组);(当然写**指针版**平衡树的大佬就可以考虑不用这个数组了) +- 一个 struct 数组 存 **每个节点** 的信息(一般叫做 tree 数组);(当然写 **指针版** 平衡树的大佬就可以考虑不用这个数组了) -- 一个**根节点数组**,存每个版本的_树根_,每次查询版本信息时就从**根数组存的节点**开始; +- 一个 **根节点数组** ,存每个版本的_树根_,每次查询版本信息时就从 **根数组存的节点** 开始; -- split() 分裂**从树中分裂出两棵树** +- split() 分裂 **从树中分裂出两棵树** -- merge() 合并**把两棵树按照随机权值合并** +- merge() 合并 **把两棵树按照随机权值合并** - newNode() 新建一个节点 @@ -53,14 +53,14 @@ Split-Merge Treap ### Split -对于**分裂操作**,每次分裂路径时**新建节点**指向分出来的路径,用 std::pair 存新分裂出来的两棵树的根。 +对于 **分裂操作** ,每次分裂路径时 **新建节点** 指向分出来的路径,用 std::pair 存新分裂出来的两棵树的根。 std::pair<int,int> split(x,k) 返回一个 std::pair; -表示把 $_x$ 为根的树的前 $k$ 个元素放在**一棵树**中,剩下的节点构成在另一棵树中,返回这两棵树的根(first 是第一棵树的根,second 是第二棵树的)。 +表示把 $_x$ 为根的树的前 $k$ 个元素放在 **一棵树** 中,剩下的节点构成在另一棵树中,返回这两棵树的根(first 是第一棵树的根,second 是第二棵树的)。 -- 如果 $x$ 的**左子树**的 $key ≥ k$ ,那么**直接递归进左子树**,把左子树分出来的第二颗树和当前的 x**右子树**合并。 -- 否则递归**右子树**。 +- 如果 $x$ 的 **左子树** 的 $key ≥ k$ ,那么 **直接递归进左子树** ,把左子树分出来的第二颗树和当前的 x **右子树** 合并。 +- 否则递归 **右子树** 。 ```c++ static std::pair _split(int _x, int k) { @@ -89,7 +89,7 @@ static std::pair _split(int _x, int k) { int merge(x,y) 返回 merge 出的树的根。 -同样递归实现。如果**x 的随机权值**>**y 的随机权值**,则 $merge(x_{rc},y)$ ,否则 $merge(x,y_{lc})$ 。 +同样递归实现。如果 **x 的随机权值** > **y 的随机权值** ,则 $merge(x_{rc},y)$ ,否则 $merge(x,y_{lc})$ 。 ```c++ static int _merge(int _x, int _y) { @@ -113,7 +113,7 @@ static int _merge(int _x, int _y) { ### 题目背景 -本题为题目**普通平衡树**的可持久化加强版。 +本题为题目 **普通平衡树** 的可持久化加强版。 数据已经经过强化 @@ -147,7 +147,7 @@ static int _merge(int _x, int _y) { ## 题解简述 -就是**普通平衡树**一题的可持久化版,操作和该题类似…… +就是 **普通平衡树** 一题的可持久化版,操作和该题类似…… 只是使用了可持久化的 merge 和 split 操作 @@ -161,6 +161,6 @@ static int _merge(int _x, int _y) { ## 另外 -1. 可持久化平衡树可以用来维护动态凸包,仙人掌等东西,如果读者有兴趣可以阅读相应的[**计算几何**](/geometry)知识,再来食用。 +1. 可持久化平衡树可以用来维护动态凸包,仙人掌等东西,如果读者有兴趣可以阅读相应的[ **计算几何** ](/geometry)知识,再来食用。 2. Zip Tree 作为一种新的数据结构在 2018.8 月由 Robert E. Tarjan - Caleb C. Levy - Stephen Timmel 提出,可以去了解一下~ diff --git a/docs/ds/persistent-in-bit.md b/docs/ds/persistent-in-bit.md index 0215db39..a360e7ee 100644 --- a/docs/ds/persistent-in-bit.md +++ b/docs/ds/persistent-in-bit.md @@ -8,9 +8,9 @@ 如果用[线段树套平衡树](/ds/balanced-in-seg/)中所论述的,用线段树套平衡树,即对于线段树的每一个节点,对于其所表示的区间维护一个平衡树,然后用二分来查找 $k$ 小值。由于每次查询操作都要覆盖多个区间,即有多个节点,但是平衡树并不能多个值一起查找,所以时间复杂度是 $O(n\log_2^3 n)$ ,并不是最优的。 -思路是,把二分答案的操作和查询小于一个值的数的数量两种操作结合起来。最好的方法是使用**线段树套主席树**。 +思路是,把二分答案的操作和查询小于一个值的数的数量两种操作结合起来。最好的方法是使用 **线段树套主席树** 。 -说是主席树其实不准确,因为并不是对线段树的可持久化,各个线段树之间也没有像主席树各版本之间的强关联性,所以称为**动态开点权值线段树**更为确切。 +说是主席树其实不准确,因为并不是对线段树的可持久化,各个线段树之间也没有像主席树各版本之间的强关联性,所以称为 **动态开点权值线段树** 更为确切。 思路类似于线段树套平衡树,即对于线段树所维护的每个区间,建立一个动态开点权值线段树,表示其所维护的区间的值。 @@ -18,7 +18,7 @@ 在查询答案时,先取出该区间覆盖在线段树上的所有点,然后用类似于静态区间 $k$ 小值的方法,将这些点一起向左儿子或向右儿子跳。如果所有这些点左儿子存储的值大于等于 $k$ ,则往左跳,否则往右跳。由于最多只能覆盖 $O(\log_2 n)$ 个节点,所以最多一次只有这么多个节点向下跳,时间复杂度为 $O(\log_2^2 n)$ 。 -由于线段树的常数较大,在实现中往往使用常数更小且更方便处理前缀和的**树状数组**实现。 +由于线段树的常数较大,在实现中往往使用常数更小且更方便处理前缀和的 **树状数组** 实现。 给出一种代码实现: diff --git a/docs/ds/persistent-seg.md b/docs/ds/persistent-seg.md index 49a90131..82287c71 100644 --- a/docs/ds/persistent-seg.md +++ b/docs/ds/persistent-seg.md @@ -2,7 +2,7 @@ 主席树全称是可持久化权值线段树,参见[知乎讨论](https://www.zhihu.com/question/59195374)。 -!!! warning**函数式线段树**是指使用函数式编程思想的线段树。在函数式编程思想中,将计算机运算视为数学函数,并避免可改变的状态或变量。不难发现,函数式线段树是[完全可持久化](/ds/persistent/#_2)的。 +!!! warning **函数式线段树** 是指使用函数式编程思想的线段树。在函数式编程思想中,将计算机运算视为数学函数,并避免可改变的状态或变量。不难发现,函数式线段树是[完全可持久化](/ds/persistent/#_2)的。 面对眼前的区间第 $k$ 小问题,你该何从下手? @@ -24,7 +24,7 @@ 怎么做呢?只需要找到插入 r 时的根节点版本,然后用普通权值线段树(有的叫键值线段树/值域线段树)做就行了。 那么这个相信大家很简单都能理解,把问题扩展到原问题——求 $[l,r]$ 区间 $k$ 小值。 -这里我们再联系另外一个知识理解:**前缀和**。 +这里我们再联系另外一个知识理解: **前缀和** 。 这个小东西巧妙运用了区间减法的性质,通过预处理从而达到 $O(1)$ 回答每个询问。 那么我们阔以发现,主席树统计的信息也满足这个性质。 diff --git a/docs/ds/scapegoat.md b/docs/ds/scapegoat.md index 93d3deff..7a531683 100644 --- a/docs/ds/scapegoat.md +++ b/docs/ds/scapegoat.md @@ -1,4 +1,4 @@ -**替罪羊树**是一种依靠重构操作维持平衡的重量平衡树。替罪羊树会在插入、删除操作时,检测途经的节点,若发现失衡,则将以该节点为根的子树重构。 + **替罪羊树** 是一种依靠重构操作维持平衡的重量平衡树。替罪羊树会在插入、删除操作时,检测途经的节点,若发现失衡,则将以该节点为根的子树重构。 我们在此实现一个可重的权值平衡树。 @@ -64,7 +64,7 @@ void Rbu(int& k) { ## 基本操作 -几种操作的处理方式较为类似,都规定了**到达空结点**与**找到对应结点**的行为,之后按**小于向左、大于向右**的方式向下递归。 +几种操作的处理方式较为类似,都规定了 **到达空结点** 与 **找到对应结点** 的行为,之后按 **小于向左、大于向右** 的方式向下递归。 ### 插入 diff --git a/docs/ds/seg-in-seg.md b/docs/ds/seg-in-seg.md index f63ccd9e..b57efa38 100644 --- a/docs/ds/seg-in-seg.md +++ b/docs/ds/seg-in-seg.md @@ -77,4 +77,4 @@ void vec_insert(int &k, int l, int r, int loc) { ## 相关算法 -面对多维度信息的题目时,如果题目没有要求强制在线,我们还可以考虑**CDQ 分治**,或者**整体二分**等分治算法,来避免使用高级数据结构,减少代码实现难度。 +面对多维度信息的题目时,如果题目没有要求强制在线,我们还可以考虑 **CDQ 分治** ,或者 **整体二分** 等分治算法,来避免使用高级数据结构,减少代码实现难度。 diff --git a/docs/ds/segment.md b/docs/ds/segment.md index fcb39712..820b906c 100644 --- a/docs/ds/segment.md +++ b/docs/ds/segment.md @@ -38,7 +38,7 @@ OI 中最常用的数据结构之一,不学不行啊 OvO O(∩\_∩)O 哈哈~ -**思路如下:**![](./images/segt2.png)![](./images/segt3.png)![](./images/segt4.png) + **思路如下:** ![](./images/segt2.png)![](./images/segt3.png)![](./images/segt4.png) 那么就这样写代码: @@ -86,11 +86,11 @@ void build(int s, int t, int p) { (发博客累死了无聊一下) 如果要查询区间 $[1,5]$ 的和,那直接获取 $d[1]$ 的值( $60$ )即可。那如果我就不查询区间 $[1,5]$ ,我就查区间 $[3,5]$ 呢? -**Σ(⊙▽⊙"a** + **Σ(⊙▽⊙"a** 懵 B 了吧。但其实呢我们肯定还是有办法的! -**<(~ˇ~)/** + **<(~ˇ~)/** 你要查的不是 $[3,5]$ 吗?我把 $[3,5]$ 拆成 $[3,3]$ 和 $[4,5]$ 不就行了吗? @@ -139,7 +139,7 @@ int getsum(int l, int r, int s, int t, int p) { ### 线段树的区间修改与懒惰标记 -区间修改是个很有趣的东西 o(╯□╰)o……你想啊,如果你要修改区间 $[l,r]$ ,难道把所有包含在区间[l,r]中的节点都遍历一次、修改一次?那估计这时间复杂度估计会上天 |(\*′口\`)。这怎么办呢?我们这里要引用一个叫做**「懒惰标记」**的东西。 +区间修改是个很有趣的东西 o(╯□╰)o……你想啊,如果你要修改区间 $[l,r]$ ,难道把所有包含在区间[l,r]中的节点都遍历一次、修改一次?那估计这时间复杂度估计会上天 |(\*′口\`)。这怎么办呢?我们这里要引用一个叫做 **「懒惰标记」** 的东西。 我们设一个数组 $b$ , $b[i]$ 表示编号为 $i$ 的节点的懒惰标记值。啥是懒惰标记、懒惰标记值呢?(O_O)? 这里我再举个栗子(原创小故事我真有才哈哈哈 (◡ᴗ◡✿)): @@ -605,11 +605,11 @@ int main() { 在查询 $[l,r]$ 这段区间的信息和的时候,将线段树树上代表 $[l,l]$ 的节点和代表 $[r,r]$ 这段区间的节点在线段树上的 lca 求出来,设这个节点 p 代表的区间为 $[L,R]$ ,我们会发现一些非常有趣的性质: -**1. $[L,R]$ 这个区间一定包含 $[l,r]$ ** + **1. $[L,R]$ 这个区间一定包含 $[l,r]$ ** 显然,因为它既是 l 的祖先又是 r 的祖先 -**2. $[l,r]$ 这个区间一定跨越[L,R]的中点** + **2. $[l,r]$ 这个区间一定跨越[L,R]的中点** 由于 p 是 l 和 r 的 lca,这意味着 p 的左儿子是 l 的祖先而不是 r 的祖先,p 的右儿子是 r 的祖先而不是 l 的祖先 diff --git a/docs/ds/sparse-table.md b/docs/ds/sparse-table.md index 7ad8ed96..6dd8ba26 100644 --- a/docs/ds/sparse-table.md +++ b/docs/ds/sparse-table.md @@ -143,15 +143,15 @@ LCA(Least Common Ancestors)表示最近公共祖先。 1. 将两个点跳到同一深度 - 将深度大的点**一步一步**往上跳,发现另一个点是他的祖先,则另一个点就是 $LCA$ + 将深度大的点 **一步一步** 往上跳,发现另一个点是他的祖先,则另一个点就是 $LCA$ 2. 一起往上跳 - 当两个点深度一样但是还没有找到 LCA 的时候,就一起往**一步一步**上跳,知道跳到了同一个点。那么,这个点即为它们的 LCA + 当两个点深度一样但是还没有找到 LCA 的时候,就一起往 **一步一步** 上跳,知道跳到了同一个点。那么,这个点即为它们的 LCA ### 树上倍增 -暴力慢的原因在于跳的时候是**一步一步**跳的,导致效率较低。如果我们可以**一次跳多步**,效率就大大提高了。 +暴力慢的原因在于跳的时候是 **一步一步** 跳的,导致效率较低。如果我们可以 **一次跳多步** ,效率就大大提高了。 #### 预处理 @@ -179,7 +179,7 @@ void dfs(int u, int father) { 依然采用暴力的思想。先将两个节点跳到同一深度,然后一起往上跳。 -只不过在跳的过程中从一步一步跳变成了**一次跳多步**。可以具体分为以下几步 +只不过在跳的过程中从一步一步跳变成了 **一次跳多步** 。可以具体分为以下几步 1. 让 $x$ 的深度比 $y$ 大(深度在预处理时已经求出) diff --git a/docs/ds/splay.md b/docs/ds/splay.md index 797c2402..7aaa591a 100644 --- a/docs/ds/splay.md +++ b/docs/ds/splay.md @@ -42,7 +42,7 @@ void clear(int x) { ch[x][0] = ch[x][1] = fa[x] = val[x] = sz[x] = cnt[x] = 0; } 为了使 $\text{Splay}$ 保持平衡而进行旋转操作,旋转的本质是将某个节点上移一个位置。 -**旋转需要保证**: + **旋转需要保证** : - 整棵 $\text{Splay}$ 的中序遍历不变(不能破坏二叉查找树的性质)。 - 受影响的节点维护的信息依然正确有效。 @@ -52,7 +52,7 @@ void clear(int x) { ch[x][0] = ch[x][1] = fa[x] = val[x] = sz[x] = cnt[x] = 0; } ![](./images/splay2.png) -**具体分析旋转步骤**(假设需要旋转的节点为 $x$ ,其父亲为 $y$ ,以右旋为例) + **具体分析旋转步骤** (假设需要旋转的节点为 $x$ ,其父亲为 $y$ ,以右旋为例) 1. 将 $y$ 的左儿子指向 $x$ 的右儿子,且 $x$ 的右儿子的父亲指向 $y$ 。 `ch[y][0]=ch[x][1]; fa[ch[x][1]]=y;` 2. 将 $x$ 的右儿子指向 $y$ ,且 $y$ 的父亲指向 $x$ 。 `ch[x][chk^1]=y; fa[y]=x;` diff --git a/docs/ds/stl.md b/docs/ds/stl.md index 0a310ff0..3460888d 100644 --- a/docs/ds/stl.md +++ b/docs/ds/stl.md @@ -10,29 +10,29 @@ STL 是 Standard Template Library 的简称,中文名为标准模板库。它 ### 序列式容器 -**向量**(vector) 连续存储的元素。 + **向量** (vector) 连续存储的元素。 -**列表**(list) 由节点组成的双向链表,每个结点包含着一个元素。 + **列表** (list) 由节点组成的双向链表,每个结点包含着一个元素。 -**双端队列**(deque) 连续存储的指向不同元素的指针所组成的数组。 + **双端队列** (deque) 连续存储的指向不同元素的指针所组成的数组。 ### 适配器容器 -**栈**(stack) 后进先出的值的排列。 + **栈** (stack) 后进先出的值的排列。 -**队列**(queue) 先进先出的值的排列。 + **队列** (queue) 先进先出的值的排列。 -**优先队列**(priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列。 + **优先队列** (priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列。 ### 关联式容器 -**集合**(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序。 + **集合** (set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序。 -**多重集合**(multiset) 允许存在两个次序相等的元素的集合。 + **多重集合** (multiset) 允许存在两个次序相等的元素的集合。 -**映射**(map) 由 {键,值} 对组成的集合,以某种作用于键对上的谓词排列。 + **映射** (map) 由 {键,值} 对组成的集合,以某种作用于键对上的谓词排列。 -**多重映射**(multimap) 允许键对有相等的次序的映射。 + **多重映射** (multimap) 允许键对有相等的次序的映射。 ## 算法 diff --git a/docs/ds/stl/bitset.md b/docs/ds/stl/bitset.md index a32d2f7d..b1c9595b 100644 --- a/docs/ds/stl/bitset.md +++ b/docs/ds/stl/bitset.md @@ -1,6 +1,6 @@ ## 介绍 - `std :: bitset` 是标准库中的一个**固定大小**序列,其储存的数据只包含 `0/1` + `std :: bitset` 是标准库中的一个 **固定大小** 序列,其储存的数据只包含 `0/1` 众所周知,由于内存地址是按字节即 `byte` 寻址,而非比特 `bit` , @@ -45,7 +45,7 @@ - `flip()` : 翻转该位 (0 变 1,1 变 0), 相当于逻辑非/异或 1 - `to_string()` : 返回转换成的字符串表达 - `to_ulong()` : 返回转换成的 `unsigned long` 表达 ( `long` 在 NT 及 32 位 POSIX 系统下与 `int` 一样,在 64 位 POSIX 下与 `long long` 一样) -- `to_ullong()` **C++11**, 返回转换成的 `unsigned long long` 表达 +- `to_ullong()` **C++11** , 返回转换成的 `unsigned long long` 表达 这些 `vector` 基本都没有 @@ -53,6 +53,6 @@ 一般来讲,我们可以用 `bitset` 优化一些可行性 DP, 或者线筛素数 ( `notprime` 这种 `bool` 数组可以用 `bitset` 开到 $10^8$ 之类的) -它最主要的作用还是压掉了内存带来的时间优化, $\frac{1}{32}$ 的常数优化已经可以是复杂度级别的优化了,比如一个 $N = 1000$ 的 $O(N^3)$ 算法, $10^9$ 显然很卡,在常数大一点的情况下必然卡不过去,**O(松)不能算!**, 这时候如果我们某一维除以 32, 则可以比较保险的过了这道题 +它最主要的作用还是压掉了内存带来的时间优化, $\frac{1}{32}$ 的常数优化已经可以是复杂度级别的优化了,比如一个 $N = 1000$ 的 $O(N^3)$ 算法, $10^9$ 显然很卡,在常数大一点的情况下必然卡不过去, **O(松)不能算!** , 这时候如果我们某一维除以 32, 则可以比较保险的过了这道题 其实 `bitset` 不光是一个容器,更是一种思想,我们可以通过手写的方式,来把 `long long` 什么的压成每 bit 表示一个信息,用 STL 的原因更多是因为它的运算符方便 diff --git a/docs/ds/stl/vector.md b/docs/ds/stl/vector.md index f3df3edb..657555ce 100644 --- a/docs/ds/stl/vector.md +++ b/docs/ds/stl/vector.md @@ -128,11 +128,11 @@ vector 有如下几种返回容量的函数 ## `vector` 修改器 - `clear()` 清除所有元素 -- `insert()` 支持在某个迭代器位置插入元素、可以插入多个**此操作是与 `pos` 距离末尾长度成线性而非常数的** +- `insert()` 支持在某个迭代器位置插入元素、可以插入多个 **此操作是与 `pos` 距离末尾长度成线性而非常数的** - `erase()` 删除某个迭代器或者区间的元素,返回最后被删除的迭代器。 - `push_back()` 在末尾插入一个元素。 - `pop_back()` 删除末尾元素。 -- `swap()` 与另一个容器进行交换,此操作是**常数复杂度**而非线性的。 +- `swap()` 与另一个容器进行交换,此操作是 **常数复杂度** 而非线性的。 ## `vector` 特化 `std::vector` diff --git a/docs/ds/virtual-tree.md b/docs/ds/virtual-tree.md index d584012c..b0aa5db2 100644 --- a/docs/ds/virtual-tree.md +++ b/docs/ds/virtual-tree.md @@ -61,9 +61,9 @@ 对于上面那题,我们不难发现——如果树的点数很少,那么我们可以直接跑 DP。 -首先我们称某次询问中被选中的点为——**「关键点」**。 +首先我们称某次询问中被选中的点为—— **「关键点」** 。 -设 $Dp[i]$ 表示——使 $i$ 不与其子树中任意一个关键点连通的**最小代价**。 +设 $Dp[i]$ 表示——使 $i$ 不与其子树中任意一个关键点连通的 **最小代价** 。 设 $w[a,b]$ 表示 $a$ 与 $b$ 之间的边的权值。 @@ -82,17 +82,17 @@ ![vtree1](./images/vtree1.png) -图中只有两个红色的点是**关键点**,而别的黑色的点全都是「非关键点」。一号节点(敌人所在之处)是树顶的那个标了 $1$ 的节点。 +图中只有两个红色的点是 **关键点** ,而别的黑色的点全都是「非关键点」。一号节点(敌人所在之处)是树顶的那个标了 $1$ 的节点。 对于这题来说,我们只需要保证红色的点无法到达 $1$ 号节点就行了。 -通过肉眼观察可以得出结论—— $1$ 号节点的右子树(虽然实际上可能有多个子树,但这里只有两个子树,所以暂时这么称呼了)一个红色节点都木有,**所以没必要去 DP 它**,不是吗? +通过肉眼观察可以得出结论—— $1$ 号节点的右子树(虽然实际上可能有多个子树,但这里只有两个子树,所以暂时这么称呼了)一个红色节点都木有, **所以没必要去 DP 它** ,不是吗? 观察题目给出的条件,红色点(关键点)的总数是与 $n$ 同阶的,也就是说实际上一次询问中红色的点对于整棵树来说是很稀疏的,所以如果我们能让复杂度由红色点的总数来决定就好了。 -因此我们需要**浓缩信息,把一整颗大树浓缩成一颗小树**。 +因此我们需要 **浓缩信息,把一整颗大树浓缩成一颗小树** 。 -由此我们引出了**「虚树」**这个概念。 +由此我们引出了 **「虚树」** 这个概念。 我们先直观地来看看虚树的样子。 @@ -200,7 +200,7 @@ - 此时栈中还有 3 个节点: $1, 3,7$ ,很明显它们是一条链上的,所以直接链接: $1->3$ 和 $3->7$ 的边。 - 虚树就建完啦! -其中有很多细节,比如我是用临接表存图的方式存虚树的,所以需要清空临接表。但是直接清空整个临接表是很慢的,所以我们在**有一个从未入栈的元素入栈的时候清空该元素对应的临接表**即可。 +其中有很多细节,比如我是用临接表存图的方式存虚树的,所以需要清空临接表。但是直接清空整个临接表是很慢的,所以我们在 **有一个从未入栈的元素入栈的时候清空该元素对应的临接表** 即可。 建立虚树的 C++ 代码大概长这样: diff --git a/docs/geometry/2d.md b/docs/geometry/2d.md index fbc57221..84b33bb3 100644 --- a/docs/geometry/2d.md +++ b/docs/geometry/2d.md @@ -131,15 +131,15 @@ $$ 于是可以快速地判断出来这两条线段不相交。 -这就是**快速排斥实验**。上述情况称作**未通过快速排斥实验**。 +这就是 **快速排斥实验** 。上述情况称作 **未通过快速排斥实验** 。 -未通过快速排斥实验是两线段无交点的**充分不必要条件**,我们还需要进一步判断。 +未通过快速排斥实验是两线段无交点的 **充分不必要条件** ,我们还需要进一步判断。 因为两线段 $a,b$ 相交, $b$ 线段的两个端点一定分布在 $a$ 线段所在直线两端;同理, $a$ 线段的两个端点一定分布在 $b$ 线段所在直线两端。我们可以直接判断一条线段的两个端点相对于另一线段所在直线的位置关系,如果不同,则两线段相交,反之则不相交。我们可以利用 3.1 中的知识帮助我们判断直线与点的位置关系。 -这就是**跨立实验**,如果对于两线段 $a,b$ , $b$ 线段的两个端点分布在 $a$ 线段所在直线的两侧,**且** $a$ 线段的两个端点分布在 $b$ 线段所在直线的两侧,我们就说 $a,b$ 两线段**通过了跨立实验**,即两线段相交。 +这就是 **跨立实验** ,如果对于两线段 $a,b$ , $b$ 线段的两个端点分布在 $a$ 线段所在直线的两侧, **且** $a$ 线段的两个端点分布在 $b$ 线段所在直线的两侧,我们就说 $a,b$ 两线段 **通过了跨立实验** ,即两线段相交。 -通过跨立实验是两线段相交的**充要条件**,因此直接利用跨立实验判断即可。 +通过跨立实验是两线段相交的 **充要条件** ,因此直接利用跨立实验判断即可。 由于快速排斥实验只需要少量比较而不需要计算,所以先用快速排斥实验判断可以减小一部分常数。 @@ -157,7 +157,7 @@ $$ 还有点在多边形的某一边或某顶点上,这种情况十分容易判断(留作课后作业)。 -我们考虑以该点为端点引出一条射线,如果这条射线与多边形有奇数个交点,则该点在多边形内部,否则该点在多边形外部,我们简记为**奇内偶外**。这个算法同样被称为奇偶规则_(Even-odd rule)_。 +我们考虑以该点为端点引出一条射线,如果这条射线与多边形有奇数个交点,则该点在多边形内部,否则该点在多边形外部,我们简记为 **奇内偶外** 。这个算法同样被称为奇偶规则_(Even-odd rule)_。 由于[Jordan curve theorem](https://en.wikipedia.org/wiki/Jordan_curve_theorem),我们知道,这条射线每次与多边形的一条边相交,就切换一次与多边形的内外关系,所以统计交点数的奇偶即可。 @@ -169,7 +169,7 @@ $$ 回转数是数学上的概念,是平面内闭合曲线逆时针绕过该点的总次数。很容易发现,当回转数等于 $0$ 的时候,点在曲线外部。这个算法同样被称为非零规则_(Nonzero-rule)_。 -如何计算呢?我们把该点与多边形的所有顶点连接起来,计算相邻两边夹角的和。注意这里的夹角是**有方向的**。如果夹角和为 $0$ ,则这个点在多边形外,否则在多边形内。 +如何计算呢?我们把该点与多边形的所有顶点连接起来,计算相邻两边夹角的和。注意这里的夹角是 **有方向的** 。如果夹角和为 $0$ ,则这个点在多边形外,否则在多边形内。 ### 求两条直线的交点 diff --git a/docs/geometry/convex-hull.md b/docs/geometry/convex-hull.md index a81f6de4..99640f9a 100644 --- a/docs/geometry/convex-hull.md +++ b/docs/geometry/convex-hull.md @@ -2,7 +2,7 @@ ### 凸多边形 -凸多边形是指所有内角大小都在 $[0,\pi]$ 范围内的**简单多边形**。 +凸多边形是指所有内角大小都在 $[0,\pi]$ 范围内的 **简单多边形** 。 ### 凸包 @@ -10,7 +10,7 @@ 其定义为: -> 对于给定集合 $X$ ,所有包含 $X$ 的凸集的交集 $S$ 被称为 $X$ 的**凸包**。 +> 对于给定集合 $X$ ,所有包含 $X$ 的凸集的交集 $S$ 被称为 $X$ 的 **凸包** 。 实际上可以理解为用一个橡皮筋包含住所有给定点的形态。 @@ -28,7 +28,7 @@ 显然排序后最小的元素和最大的元素一定在凸包上。而且因为是凸多边形,我们如果从一个点出发逆时针走,轨迹总是“左拐”的,一旦出现右拐,就说明这一段不在凸包上。因此我们可以用一个单调栈来维护上下凸壳。 -因为从左向右看,上下凸壳所旋转的方向不同,为了让单调栈起作用,我们首先**升序枚举**求出下凸壳,然后**降序**求出上凸壳。 +因为从左向右看,上下凸壳所旋转的方向不同,为了让单调栈起作用,我们首先 **升序枚举** 求出下凸壳,然后 **降序** 求出上凸壳。 求凸壳时,一旦发现即将进栈的点( $P$ )和栈顶的两个点( $S_1,S_2$ ,其中 $S_1$ 为栈顶)行进的方向向右旋转,即叉积小于 $0$ : $\overrightarrow{S_2S_1}\times \overrightarrow{S_1P}<0$ ,则弹出栈顶,回到上一步,继续检测,直到 $\overrightarrow{S_2S_1}\times \overrightarrow{S_1P}\ge 0$ 或者栈内仅剩一个元素为止。 diff --git a/docs/geometry/pick.md b/docs/geometry/pick.md index 07c38999..46e536be 100644 --- a/docs/geometry/pick.md +++ b/docs/geometry/pick.md @@ -7,9 +7,9 @@ Pick 定理:给定顶点座标均是整点(或正方形格子点)的简单 它有以下推广: - 取格点的组成图形的面积为一单位。在平行四边形格点,皮克定理依然成立。套用于任意三角形格点,皮克定理则是 ${\displaystyle A=2 \times i+b-2}$ 。 -- 对于非简单的多边形 ${\displaystyle P}$ ,皮克定理 ${\displaystyle A=i+{\frac {b}{2}}-\chi (P)}$ ,其中 ${\displaystyle \chi (P)}$ 表示 ${\displaystyle P}$ 的**欧拉特征数**。 +- 对于非简单的多边形 ${\displaystyle P}$ ,皮克定理 ${\displaystyle A=i+{\frac {b}{2}}-\chi (P)}$ ,其中 ${\displaystyle \chi (P)}$ 表示 ${\displaystyle P}$ 的 **欧拉特征数** 。 - 高维推广:Ehrhart 多项式 -- 皮克定理和**欧拉公式**( ${\displaystyle V-E+F=2}$ )等价。 +- 皮克定理和 **欧拉公式** ( ${\displaystyle V-E+F=2}$ )等价。 ## 一道例题 (POJ 1265) @@ -21,7 +21,7 @@ Pick 定理:给定顶点座标均是整点(或正方形格子点)的简单 这道题目其实用了以下三个知识: -- 以格子点为顶点的线段,覆盖的点的个数为 $\gcd(dx,dy)$ ,其中, $dx,dy$ 分别为线段横向占的点数和纵向占的点数。如果 $dx$ 或 $dy$ 为 $0$ ,则覆盖的点数为 $dy$ **或** $dx$ 。 +- 以格子点为顶点的线段,覆盖的点的个数为 $\gcd(dx,dy)$ ,其中, $dx,dy$ 分别为线段横向占的点数和纵向占的点数。如果 $dx$ 或 $dy$ 为 $0$ ,则覆盖的点数为 $dy$ **或** $dx$ 。 - Pick 定理:平面上以格子点为顶点的简单多边形的面积 = 边上的点数/2 + 内部的点数 + 1。 - 任意一个多边形的面积等于按顺序求相邻两个点与原点组成的向量的叉积之和(这个也可以通过顺时针定积分求得)。 于是这题就愉快地做完了 diff --git a/docs/graph/2-sat.md b/docs/graph/2-sat.md index 15b26d2a..cd4c6f8f 100644 --- a/docs/graph/2-sat.md +++ b/docs/graph/2-sat.md @@ -75,7 +75,7 @@ struct Twosat { ## 例题 -### **HDU3062[Party](http://acm.hdu.edu.cn/showproblem.php?pid=3062)** +### **HDU3062[Party](http://acm.hdu.edu.cn/showproblem.php?pid=3062)** > 题面:有 n 对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有 $1$ 人可以列席。在 $2n$ 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的 $2$ 个人是不会同时出现在聚会上的。有没有可能会有 $n$ 个人同时列席? diff --git a/docs/graph/bcc.md b/docs/graph/bcc.md index 9a72e209..c98c13ea 100644 --- a/docs/graph/bcc.md +++ b/docs/graph/bcc.md @@ -6,23 +6,23 @@ ## 定义 -在一张连通的无向图中,如果将一条边删去后,原图变成不连通的两部分,我们就说这条边是**桥**。 +在一张连通的无向图中,如果将一条边删去后,原图变成不连通的两部分,我们就说这条边是 **桥** 。 -在一张连通的无向图中,如果将一个点删去后,原图变成不连通的两部分,我们就说这个点是**割点**。 +在一张连通的无向图中,如果将一个点删去后,原图变成不连通的两部分,我们就说这个点是 **割点** 。 -在一张连通的无向图中,对于两个点 $u$ 和 $v$ ,如果无论删去哪条边(只能删去一条)都不能使它们不连通,我们就说 $u$ 和 $v$ **边双连通**。 +在一张连通的无向图中,对于两个点 $u$ 和 $v$ ,如果无论删去哪条边(只能删去一条)都不能使它们不连通,我们就说 $u$ 和 $v$ **边双连通** 。 -在一张连通的无向图中,对于两个点 $u$ 和 $v$ ,如果无论删去哪个点(只能删去一个,且不能删 $u$ 和 $v$ 自己)都不能使它们不连通,我们就说 $u$ 和 $v$ **点双连通**。 +在一张连通的无向图中,对于两个点 $u$ 和 $v$ ,如果无论删去哪个点(只能删去一个,且不能删 $u$ 和 $v$ 自己)都不能使它们不连通,我们就说 $u$ 和 $v$ **点双连通** 。 边双连通具有传递性,即,若 $x,y$ 边双连通, $y,z$ 边双连通,则 $x,z$ 边双连通。 -点双连通**不**具有传递性,反例如下图, $A,B$ 点双连通, $B,C$ 点双连通,而 $A,C$ **不**点双连通。 +点双连通 **不** 具有传递性,反例如下图, $A,B$ 点双连通, $B,C$ 点双连通,而 $A,C$ **不** 点双连通。 ![bcc-counterexample.png](images/bcc-counterexample.png) ## DFS -对于一张连通的无向图,我们可以从任意一点开始 DFS,得到原图的一棵生成树(以开始 DFS 的那个点为根),这棵生成树上的边称作**树边**,不在生成树上的边称作**非树边**。 +对于一张连通的无向图,我们可以从任意一点开始 DFS,得到原图的一棵生成树(以开始 DFS 的那个点为根),这棵生成树上的边称作 **树边** ,不在生成树上的边称作 **非树边** 。 由于 DFS 的性质,我们可以保证所有非树边连接的两个点在生成树上都满足其中一个是另一个的祖先。 @@ -42,7 +42,7 @@ void DFS(int p) { ![bcc-1.png](images/bcc-1.png) -如上图所示,黑色与绿色边为树边,红色边为非树边。每一条非树边连接的两个点都对应了树上的一条简单路径,我们说这条非树边**覆盖**了这条树上路径上所有的边。绿色的树边**至少**被一条非树边覆盖,黑色的树边不被**任何**非树边覆盖。 +如上图所示,黑色与绿色边为树边,红色边为非树边。每一条非树边连接的两个点都对应了树上的一条简单路径,我们说这条非树边 **覆盖** 了这条树上路径上所有的边。绿色的树边 **至少** 被一条非树边覆盖,黑色的树边不被 **任何** 非树边覆盖。 我们如何判断一条边是不是桥呢?显然,非树边和绿色的树边一定不是桥,黑色的树边一定是桥。 @@ -50,7 +50,7 @@ void DFS(int p) { 怎么优化呢?可以用差分。对于每一条非树边,在其树上深度较小的点处打上 `-1` 标记,在其树上深度较大的点处打上 `+1` 标记。然后 $O(n)$ 求出每个点的子树内部的标记之和。对于一个点 $u$ ,其子树内部的标记之和等于覆盖了 $u$ 和 $u$ 的父亲之间的树边的非树边数量。若这个值非 $0$ ,则 $u$ 和 $u$ 的父亲之间的树边不是桥,否则是桥。 -用以上的方法 $O(n+m)$ 求出每条边分别是否是桥后,两个点是边双连通的,当且仅当它们的树上路径中**不**包含桥。 +用以上的方法 $O(n+m)$ 求出每条边分别是否是桥后,两个点是边双连通的,当且仅当它们的树上路径中 **不** 包含桥。 ## DFS 找割点并判断点双连通 diff --git a/docs/graph/differential-constraints.md b/docs/graph/differential-constraints.md index 49f56970..37c378ce 100644 --- a/docs/graph/differential-constraints.md +++ b/docs/graph/differential-constraints.md @@ -1,4 +1,4 @@ -**差分约束系统**是一种特殊的 $n$ 元一次不等式组,它包含 $n$ 个变量 $x_1,x_2,...,x_n$ 以及 $m$ 个约束条件,每个约束条件是由两个其中的变量做差构成的,形如 $x_i-x_j\leq c_k$ ,其中 $c_k$ 是常数(可以是非负数,也可以是负数)。我们要解决的问题是:求一组解 $x_1=a_1,x_2=a_2,...,x_n=a_n$ ,使得所有的约束条件得到满足,否则判断出无解。 + **差分约束系统** 是一种特殊的 $n$ 元一次不等式组,它包含 $n$ 个变量 $x_1,x_2,...,x_n$ 以及 $m$ 个约束条件,每个约束条件是由两个其中的变量做差构成的,形如 $x_i-x_j\leq c_k$ ,其中 $c_k$ 是常数(可以是非负数,也可以是负数)。我们要解决的问题是:求一组解 $x_1=a_1,x_2=a_2,...,x_n=a_n$ ,使得所有的约束条件得到满足,否则判断出无解。 差分约束系统中的每个约束条件 $x_i-x_j\leq c_k$ 都可以变形成 $x_i\leq x_j+c_k$ ,这与单源最短路中的三角形不等式 $dist[y]\leq dist[x]+z$ 非常相似。因此,我们可以把每个变量 $x_i$ 看做图中的一个结点,对于每个约束条件 $x_i-x_j\leq c_k$ ,从结点 $j$ 向结点 $i$ 连一条长度为 $c_k$ 的有向边。 diff --git a/docs/graph/flow/max-flow.md b/docs/graph/flow/max-flow.md index 3a3f91ef..98597e63 100644 --- a/docs/graph/flow/max-flow.md +++ b/docs/graph/flow/max-flow.md @@ -8,13 +8,13 @@ 求解最大流之前,我们先认识以下增广路的概念。 -**增广路**指的是,从源点到汇点,只要有 $flow$ ( $flow>0$ ) 流过去,这条路就是增广路。在一些最大流算法中,就是将这些路**增广**(意思就是走掉这条路,带走的流量肯定就是这条路的最小流量),如图: + **增广路** 指的是,从源点到汇点,只要有 $flow$ ( $flow>0$ ) 流过去,这条路就是增广路。在一些最大流算法中,就是将这些路 **增广** (意思就是走掉这条路,带走的流量肯定就是这条路的最小流量),如图: ![](./images/flow1.png) 我们从 $4$ 到 $3$ ,肯定可以先从流量为 $20$ 的这条边先走。那么这条边就被走掉了,不能再选,总的流量为 $20$ (现在)。然后我们可以这样选择: -1. $4\rightarrow2\rightarrow3$ 这条**增广路**的总流量为 $20$ 。到 $2$ 的时候还是 $30$ ,到 $3$ 了就只有 $20$ 了。 +1. $4\rightarrow2\rightarrow3$ 这条 **增广路** 的总流量为 $20$ 。到 $2$ 的时候还是 $30$ ,到 $3$ 了就只有 $20$ 了。 2. $4\rightarrow2\rightarrow1\rightarrow3$ 这样子我们就很好的保留了 $30$ 的流量。 @@ -24,13 +24,13 @@ ### Edmond-Karp 动能算法( $EK$ 算法) -这个算法很简单,就是 BFS**找增广路**,然后对其进行**增广**。你可能会问,怎么找?怎么增广? +这个算法很简单,就是 BFS **找增广路** ,然后对其进行 **增广** 。你可能会问,怎么找?怎么增广? 1. 找?我们就从源点一直 BFS 走来走去,碰到汇点就停,然后增广(每一条路都要增广)。我们在 BFS 的时候就注意一下流量合不合法就可以了。 2. 增广?其实就是按照我们找的增广路在重新走一遍。走的时候把这条路的能够成的最大流量减一减,然后给答案加上最小流量就可以了。 -再讲一下**反向边**。增广的时候要注意建造反向边,原因是这条路不一定是最优的,这样子程序可以进行反悔。假如我们对这条路进行增广了,那么其中的每一条边的反向边的流量就是它的流量。 +再讲一下 **反向边** 。增广的时候要注意建造反向边,原因是这条路不一定是最优的,这样子程序可以进行反悔。假如我们对这条路进行增广了,那么其中的每一条边的反向边的流量就是它的流量。 ![](./images/flow2.png) @@ -104,7 +104,7 @@ int main() { ### Dinic -**Dinic 算法**的过程是这样的:每次增广前,我们先用 BFS 来将图分层。设源点的层数为 0,那么一个点的层数便是它离源点的最近距离。 + **Dinic 算法** 的过程是这样的:每次增广前,我们先用 BFS 来将图分层。设源点的层数为 0,那么一个点的层数便是它离源点的最近距离。 通过分层,我们可以干两件事情: @@ -117,8 +117,8 @@ int main() { Dinic 算法有两个优化: -1. **多路增广**:每次找到一条增广路的时候,如果残余流量没有用完怎么办呢?我们可以利用残余部分流量,再找出一条增广路。这样就可以在一次 DFS 中找出多条增广路,大大提高了算法的效率。 -2. **当前弧优化**:如果一条边已经被增广过,那么它就没有可能被增广第二次。那么,我们下一次进行增广的时候,就可以不必再走那些已经被增广过的边。 +1. **多路增广** :每次找到一条增广路的时候,如果残余流量没有用完怎么办呢?我们可以利用残余部分流量,再找出一条增广路。这样就可以在一次 DFS 中找出多条增广路,大大提高了算法的效率。 +2. **当前弧优化** :如果一条边已经被增广过,那么它就没有可能被增广第二次。那么,我们下一次进行增广的时候,就可以不必再走那些已经被增广过的边。 设点数为 $n$ ,边数为 $m$ ,那么 Dinic 算法的时间复杂度是 $O(nm^2)$ ,在稀疏图上效率和 EK 算法相当,但在稠密图上效率要比 EK 算法高很多。 diff --git a/docs/graph/flow/node.md b/docs/graph/flow/node.md index a1f1dd51..48349205 100644 --- a/docs/graph/flow/node.md +++ b/docs/graph/flow/node.md @@ -1,4 +1,4 @@ -拆点是一种**[网络流](/graph/flow/)**建模思想,用来处理**点权或者点的流量限制**的问题。这种思路同样可以用于其他的图论算法中(比较经典的有**分层图**) +拆点是一种 **[网络流](/graph/flow/)** 建模思想,用来处理 **点权或者点的流量限制** 的问题。这种思路同样可以用于其他的图论算法中(比较经典的有 **分层图** ) ## 例题 经典问题 结点有流量限制的最大流 diff --git a/docs/graph/heavy-light-decomposition.md b/docs/graph/heavy-light-decomposition.md index 7addd42e..5bacf2d2 100644 --- a/docs/graph/heavy-light-decomposition.md +++ b/docs/graph/heavy-light-decomposition.md @@ -1,20 +1,20 @@ -在学习本部分时,请先学习**[线段树](/ds/segment/)**的相关内容。 +在学习本部分时,请先学习 **[线段树](/ds/segment/)** 的相关内容。 ## 树链剖分的思想及能解决的问题 一棵静态(形状固定的)树,要求进行几种操作: -1. 修改**单个节点/树上两点之间的路径/一个节点的子树上**的所有点的值。 +1. 修改 **单个节点/树上两点之间的路径/一个节点的子树上** 的所有点的值。 -2. 查询**单个节点/树上两点之间的路径/一个节点的子树上**节点的值的**和/极值/其他(具有较强的合并性)**。 +2. 查询 **单个节点/树上两点之间的路径/一个节点的子树上** 节点的值的 **和/极值/其他(具有较强的合并性)** 。 如果树的形态是一条链,那么我们只需要维护一个线段树,修改或查询线段树的值。 因为这是一棵树,我们将这个树剖分成多个链,并用线段树修改或查询答案,这就是树链剖分的思想。 -如果树是动态的,需要使用**LCT**来解决。 +如果树是动态的,需要使用 **LCT** 来解决。 -由于树链剖分的思想十分暴力,所以被 OIers 戏称为**“优雅的暴力”**。 +由于树链剖分的思想十分暴力,所以被 OIers 戏称为 **“优雅的暴力”** 。 ## 例题[luogu P2590\[ZJOI2008\]树的统计](https://www.luogu.org/problemnew/show/P2590) @@ -36,15 +36,15 @@ $siz(x)$ 表示节点 $x$ 的子树的节点个数。 - $son(x)$ 表示节点 $x$ 的**重儿子**,即所有儿子中子树大小最大的一个。 + $son(x)$ 表示节点 $x$ 的 **重儿子** ,即所有儿子中子树大小最大的一个。 -定义**重边**表示连接两个重儿子的边。 +定义 **重边** 表示连接两个重儿子的边。 -定义**重路径**表示重边连成的一条链。 +定义 **重路径** 表示重边连成的一条链。 - $top(x)$ 表示节点 $x$ 所在**重路径**的顶部节点(深度最小)。 + $top(x)$ 表示节点 $x$ 所在 **重路径** 的顶部节点(深度最小)。 - $tid(x)$ 表示节点 $x$ 的**时间戳**,也是其在线段树中的编号。 + $tid(x)$ 表示节点 $x$ 的 **时间戳** ,也是其在线段树中的编号。 $rnk(x)$ 表示时间戳所对应的节点编号,有 $rnk(tid(x))=x$ 。 @@ -77,7 +77,7 @@ void dfs2(int o, int t) { } ``` -这样构成的线段树有这样一个性质,这是原树的一个 DFS 序,一个节点的子树在线段树中是相连的,**所有重链在线段树上也是相连的**。 +这样构成的线段树有这样一个性质,这是原树的一个 DFS 序,一个节点的子树在线段树中是相连的, **所有重链在线段树上也是相连的** 。 ## 解法 @@ -95,7 +95,7 @@ void dfs2(int o, int t) { 问题是如何修改/查询两个节点之间的路径。 -考虑我们是如何用**倍增法求解 LCA**的。首先我们**将两个节点提到同一高度,然后将两个节点一起向上跳**。对于树链剖分也可以使用这样的思想。 +考虑我们是如何用 **倍增法求解 LCA** 的。首先我们 **将两个节点提到同一高度,然后将两个节点一起向上跳** 。对于树链剖分也可以使用这样的思想。 在向上跳的过程中,如果当前节点在重链上,借助线段树向上跳到重链顶端,如果当前节点不在重链上,向上跳一个节点。如此直到两节点相同。沿途更新/查询区间信息。 @@ -277,7 +277,7 @@ int main() { 因为如果 $siz(v)> \frac{1}{2} siz(u)$ ,那么 $siz(v)$ 大于其他 $u$ 的儿子的 $siz$ 的和,就有 $siz(v)$ 大于其他 $u$ 的儿子的 $siz$ 。这样 $v$ 一定是 $u$ 的重儿子,与题设不符。 -由此可知,每次查询操作,我们顺着**非重链**向上跳,其子树节点个数一定至少**乘以 2**。如果我们顺着重链向上跳,其子树节点个数也会乘以 2,最大为 $n$ 。 +由此可知,每次查询操作,我们顺着 **非重链** 向上跳,其子树节点个数一定至少 **乘以 2** 。如果我们顺着重链向上跳,其子树节点个数也会乘以 2,最大为 $n$ 。 由于一个点的子树的节点个数最多为 $n$ ,所以我们最多只需要向上跳 $O(\log n)$ 次。再乘上线段树查询的时间复杂度 $O(\log n)$ 和操作数 $O(q)$ ,最后的时间复杂度为 $O(q \log^2 n)$ 。证毕。 diff --git a/docs/graph/index.md b/docs/graph/index.md index 4fe368fc..f6bfa14b 100644 --- a/docs/graph/index.md +++ b/docs/graph/index.md @@ -1,4 +1,4 @@ -**图论(graph theory)**是数学的一个分支,它以**图**为研究的对象。 + **图论(graph theory)** 是数学的一个分支,它以 **图** 为研究的对象。 图论本身是应用数学的一部分,历史上图论曾经被很多数学家各自独立建立过。关于图论的最早文字记载最早出现在欧拉 1736 年的论著中,也就是著名的柯尼斯堡(Konigsberg)问题(七桥问题)。 @@ -10,9 +10,9 @@ ## 有向边和无向边 -以上定义的结点对**可以是有序的,也可以是无序的**。如果边 $e_i$ 和结点无序对 $(u,v)$ 相对应,则称 $e_i$ 为无向边,记作 $e_i=(u,v)$ ,称 $u,v$ 为边 $e_i$ 的两个端点。 +以上定义的结点对 **可以是有序的,也可以是无序的** 。如果边 $e_i$ 和结点无序对 $(u,v)$ 相对应,则称 $e_i$ 为无向边,记作 $e_i=(u,v)$ ,称 $u,v$ 为边 $e_i$ 的两个端点。 -如果边 $e_i$ 和结点有序对 $\langle u,v\rangle$ 相对应,则称 $e_i$ 为有向边,记为 $e_i= \langle u,v\rangle$ ,称 $u$ 为边 $e_i$ 的**始点**, $v$ 为该边的终点。 +如果边 $e_i$ 和结点有序对 $\langle u,v\rangle$ 相对应,则称 $e_i$ 为有向边,记为 $e_i= \langle u,v\rangle$ ,称 $u$ 为边 $e_i$ 的 **始点** , $v$ 为该边的终点。 简单来说,如果边对结点的关系是双向的,那么这条边是无向边;如果是单向的,那么这条边是有向边。 @@ -40,7 +40,7 @@ ## 结点的度数 -设图 $G= \langle V,E\rangle$ 为一个有向图, $v\in V$ ,关联于结点 $v$ 的**边**的条数,称为点 $v$ 的度数,记作 $deg(v)$ 。 +设图 $G= \langle V,E\rangle$ 为一个有向图, $v\in V$ ,关联于结点 $v$ 的 **边** 的条数,称为点 $v$ 的度数,记作 $deg(v)$ 。 注意:一个自环为它的端点增加 2 度。 diff --git a/docs/graph/lca.md b/docs/graph/lca.md index 4fda4d17..f68493dd 100644 --- a/docs/graph/lca.md +++ b/docs/graph/lca.md @@ -136,7 +136,7 @@ LCA 为两个游标跳转到同一条重链上时深度较小的那个游标所 ### 动态树 -> 本节**性质**部分内容翻译自[wcipeg](http://wcipeg.com/wiki/Lowest_common_ancestor),并做过修改。 +> 本节 **性质** 部分内容翻译自[wcipeg](http://wcipeg.com/wiki/Lowest_common_ancestor),并做过修改。 ### 标准 RMQ @@ -154,7 +154,7 @@ LCA 为两个游标跳转到同一条重链上时深度较小的那个游标所 每一步的复杂度都是 $O(N)$ 的,因此总复杂度依然是 $O(N)$ 。 -提供 RMQ 转标准 RMQ 的代码,为洛谷上 ST 表的例题[**P3865**【模板】ST 表](https://www.luogu.org/problemnew/show/P3865) +提供 RMQ 转标准 RMQ 的代码,为洛谷上 ST 表的例题[ **P3865** 【模板】ST 表](https://www.luogu.org/problemnew/show/P3865) ```cpp // Copyright (C) 2018 Skqliao. All rights served. diff --git a/docs/graph/mst.md b/docs/graph/mst.md index 5c901c49..fd214487 100644 --- a/docs/graph/mst.md +++ b/docs/graph/mst.md @@ -40,7 +40,7 @@ 具体来说,维护一个森林,查询两个结点是否在同一棵树中,连接两棵树。 -抽象一点地说,维护一堆**集合**,查询两个元素是否属于同一集合,合并两个集合。 +抽象一点地说,维护一堆 **集合** ,查询两个元素是否属于同一集合,合并两个集合。 我们先啥都不管,假设已经实现了这个数据结构…… @@ -239,7 +239,7 @@ Kruskal 算法中的「集合」,能否进一步优化? ## 最小生成树的唯一性 -考虑最小生成树的唯一性。如果一条边**不在最小生成树的边集中**,并且可以替换与其**权值相同、并且在最小生成树边集**的另一条边。那么,这个最小生成树就是不唯一的。 +考虑最小生成树的唯一性。如果一条边 **不在最小生成树的边集中** ,并且可以替换与其 **权值相同、并且在最小生成树边集** 的另一条边。那么,这个最小生成树就是不唯一的。 对于 Kruskal 算法,只要计算为当前权值的边可以放几条,实际放了几条,如果这两个值不一样,那么就说明这几条边与之前的边产生了一个环(这个环中至少有两条当前权值的边,否则根据并查集,这条边是不能放的),即最小生成树不唯一。 diff --git a/docs/graph/shortest-path.md b/docs/graph/shortest-path.md index 46175692..a164223c 100644 --- a/docs/graph/shortest-path.md +++ b/docs/graph/shortest-path.md @@ -131,7 +131,7 @@ while (1) for each edge(u, v) relax(u, v); 所以最多循环 $n-1$ 次。 -总时间复杂度 $O(NM)$ 。**(对于最短路存在的图)** +总时间复杂度 $O(NM)$ 。 **(对于最短路存在的图)** ```text relax(u, v) { @@ -183,7 +183,7 @@ while (!q.empty()) { } ``` -SPFA 的时间复杂度为 $O(kM)~ (k\approx 2)$ (玄学),但**理论上界**为 $O(NM)$ ,精心设计的稠密图可以随便卡掉 SPFA,所以考试时谨慎使用(NOI 2018 卡 SPFA)。 +SPFA 的时间复杂度为 $O(kM)~ (k\approx 2)$ (玄学),但 **理论上界** 为 $O(NM)$ ,精心设计的稠密图可以随便卡掉 SPFA,所以考试时谨慎使用(NOI 2018 卡 SPFA)。 #### SPFA 的优化之 SLF diff --git a/docs/graph/tree-basic.md b/docs/graph/tree-basic.md index 56d4de75..dd2d2fe1 100644 --- a/docs/graph/tree-basic.md +++ b/docs/graph/tree-basic.md @@ -1,6 +1,6 @@ 图论中的树和现实生活中的树长得一样,只不过我们习惯于处理问题的时候把树根放到上方来考虑。这种数据结构看起来像是一个倒挂的树,因此得名。 -一个没有固定根结点的树称为**无根树**(unrooted tree)。无根树有几种等价的形式化定义: +一个没有固定根结点的树称为 **无根树** (unrooted tree)。无根树有几种等价的形式化定义: - 有 $n$ 个结点, $n-1$ 条边的连通无向图 @@ -12,63 +12,63 @@ - 没有圈,且在任意不同两点间添加一条边之后所得图含唯一的一个圈的图 -在无根树的基础上,指定一个结点称为**根**,则形成一棵**有根树**(rooted tree)。有根树在很多时候仍以无向图表示,只是规定了结点之间的上下级关系,详见下文。 +在无根树的基础上,指定一个结点称为 **根** ,则形成一棵 **有根树** (rooted tree)。有根树在很多时候仍以无向图表示,只是规定了结点之间的上下级关系,详见下文。 ## 有关树的定义 ### 适用于无根树和有根树 -- **森林(forest)**:每个连通分量(连通块)都是树的图。按照定义,一棵树也是森林。 +- **森林(forest)** :每个连通分量(连通块)都是树的图。按照定义,一棵树也是森林。 -- **生成树(spanning tree)**:一个连通无向图的生成子图,同时要求是树。也即在图的边集中选择 $n - 1$ 条,将所有顶点连通。 +- **生成树(spanning tree)** :一个连通无向图的生成子图,同时要求是树。也即在图的边集中选择 $n - 1$ 条,将所有顶点连通。 -- **结点的深度(depth)**:到根结点的路径上的边数。 +- **结点的深度(depth)** :到根结点的路径上的边数。 -- **树的高度(height)**:所有结点的深度的最大值。 +- **树的高度(height)** :所有结点的深度的最大值。 -- **无根树的叶结点(leaf node)**:度数不超过 $1$ 的结点。 +- **无根树的叶结点(leaf node)** :度数不超过 $1$ 的结点。 ???+question " 为什么不是度数恰为 $1$ ?" 考虑 $n = 1$ 。 -- **有根树的叶结点(leaf node)**:没有子结点的结点。 +- **有根树的叶结点(leaf node)** :没有子结点的结点。 ### 只适用于有根树 -- **父亲(parent node)**:对于除根以外的每个结点,定义为从该结点到根路径上的第二个结点。 +- **父亲(parent node)** :对于除根以外的每个结点,定义为从该结点到根路径上的第二个结点。 根结点没有父结点。 -- **祖先(ancestor)**:一个结点到根结点的路径上,除了它本身外的结点。 +- **祖先(ancestor)** :一个结点到根结点的路径上,除了它本身外的结点。 根结点的祖先集合为空。 -- **子结点(child node)**:如果 $u$ 是 $v$ 的父亲,那么 $v$ 是 $u$ 的子结点。 +- **子结点(child node)** :如果 $u$ 是 $v$ 的父亲,那么 $v$ 是 $u$ 的子结点。 子结点的顺序一般不加以区分,二叉树是一个例外。 -- **兄弟(sibling)**:同一个父亲的多个子结点互为兄弟。 +- **兄弟(sibling)** :同一个父亲的多个子结点互为兄弟。 -- **后代(descendant)**:子结点和子结点的后代。 +- **后代(descendant)** :子结点和子结点的后代。 或者理解成:如果 $u$ 是 $v$ 的祖先,那么 $v$ 是 $u$ 的后代。 -- **子树(subtree)**:删掉与父亲相连的边后,该结点所在的子图。 +- **子树(subtree)** :删掉与父亲相连的边后,该结点所在的子图。 ![tree-basic.png](images/tree-basic.png) ## 特殊的树 -- **链(chain/path graph)**:满足与任一结点相连的边不超过 $2$ 条的树称为链。 +- **链(chain/path graph)** :满足与任一结点相连的边不超过 $2$ 条的树称为链。 -- **菊花/星星(star)**:满足存在 $u$ 使得所有除 $u$ 以外结点均与 $u$ 相连的树称为菊花。 +- **菊花/星星(star)** :满足存在 $u$ 使得所有除 $u$ 以外结点均与 $u$ 相连的树称为菊花。 -- **有根二叉树(rooted binary tree)**:每个结点最多只有两个儿子(子结点)的有根树称为二叉树。常常对两个子结点的顺序加以区分,分别称之为左子结点和右子结点。 - 大多数情况下,**二叉树**一词均指有根二叉树。 +- **有根二叉树(rooted binary tree)** :每个结点最多只有两个儿子(子结点)的有根树称为二叉树。常常对两个子结点的顺序加以区分,分别称之为左子结点和右子结点。 + 大多数情况下, **二叉树** 一词均指有根二叉树。 ![tree-binary.png](images/tree-binary.png) -- **完整二叉树(full/proper binary tree)**:每个结点的子结点数量均为 0 或者 2 的二叉树。换言之,每个结点或者是树叶,或者左右子树均非空。 +- **完整二叉树(full/proper binary tree)** :每个结点的子结点数量均为 0 或者 2 的二叉树。换言之,每个结点或者是树叶,或者左右子树均非空。 -- **完全二叉树(complete binary tree)**:只有最下面两层结点的度数可以小于 2,且最下面一层的结点都集中在该层最左边的连续位置上。 +- **完全二叉树(complete binary tree)** :只有最下面两层结点的度数可以小于 2,且最下面一层的结点都集中在该层最左边的连续位置上。 -- **完美二叉树(perfect binary tree)**:所有叶结点的深度均相同的二叉树称为完美二叉树。 +- **完美二叉树(perfect binary tree)** :所有叶结点的深度均相同的二叉树称为完美二叉树。 ???+warning Proper binary tree 的汉译名称不固定,且完全二叉树和满二叉树的定义在不同教材中定义不同,遇到的时候需根据上下文加以判断。 @@ -103,7 +103,7 @@ OIers 所说的“满二叉树”多指完美二叉树。 首先,给每个结点的所有子结点任意确定一个顺序。 -此后为每个结点记录两个值:其**第一个子结点** `child[u]` 和其**下一个兄弟结点** `sib[u]` 。若没有子结点,则 `child[u]` 为空;若该结点是其父结点的最后一个子结点,则 `sib[u]` 为空。 +此后为每个结点记录两个值:其 **第一个子结点** `child[u]` 和其 **下一个兄弟结点** `sib[u]` 。若没有子结点,则 `child[u]` 为空;若该结点是其父结点的最后一个子结点,则 `sib[u]` 为空。 遍历一个结点的所有子结点可由如下方式实现。 diff --git a/docs/index.md b/docs/index.md index df176cd7..76f95df9 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,15 +2,15 @@ disqus: pagetime: title: OI Wiki -# 欢迎来到**OI Wiki**![![GitHub watchers](https://img.shields.io/github/watchers/24OI/OI-Wiki.svg?style=social&label=Watch)](https://github.com/24OI/OI-wiki)[![GitHub stars](https://img.shields.io/github/stars/24OI/OI-Wiki.svg?style=social&label=Stars)](https://github.com/24OI/OI-wiki) +# 欢迎来到 **OI Wiki** ![![GitHub watchers](https://img.shields.io/github/watchers/24OI/OI-Wiki.svg?style=social&label=Watch)](https://github.com/24OI/OI-wiki)[![GitHub stars](https://img.shields.io/github/stars/24OI/OI-Wiki.svg?style=social&label=Stars)](https://github.com/24OI/OI-wiki) [![Word Art](./images/wordArt.png)](https://github.com/24OI/OI-wiki) -**OI**(Olympiad in Informatics,信息学奥林匹克竞赛)在中国起源于 1984 年,是五大高中学科竞赛之一。自 1989 年起,每年还会选拔出国家集训队选手准备 IOI (International Olympiad in Informatics,国际信息学奥林匹克竞赛)。 + **OI** (Olympiad in Informatics,信息学奥林匹克竞赛)在中国起源于 1984 年,是五大高中学科竞赛之一。自 1989 年起,每年还会选拔出国家集训队选手准备 IOI (International Olympiad in Informatics,国际信息学奥林匹克竞赛)。 -**ICPC**(International Collegiate Programming Contest, 国际大学生程序设计竞赛)由 ICPC 基金会(ICPC Foundation)举办,是最具影响力的大学生计算机竞赛。ICPC 主要分为区域赛(Regionals)和总决赛(World Finals)两部分。由于以前 ACM 赞助这个竞赛,也有很多人习惯叫它 ACM 竞赛。 + **ICPC** (International Collegiate Programming Contest, 国际大学生程序设计竞赛)由 ICPC 基金会(ICPC Foundation)举办,是最具影响力的大学生计算机竞赛。ICPC 主要分为区域赛(Regionals)和总决赛(World Finals)两部分。由于以前 ACM 赞助这个竞赛,也有很多人习惯叫它 ACM 竞赛。 -**OI Wiki**致力于成为一个免费开放且持续更新的知识整合站点,大家可以在这里获取关于**编程竞赛 (competitive programming)**有趣又实用的知识,我们为大家准备了竞赛中的基础知识、常见题型、解题思路以及常用工具等内容,帮助大家更快速深入地学习编程竞赛。 + **OI Wiki** 致力于成为一个免费开放且持续更新的知识整合站点,大家可以在这里获取关于 **编程竞赛 (competitive programming)** 有趣又实用的知识,我们为大家准备了竞赛中的基础知识、常见题型、解题思路以及常用工具等内容,帮助大家更快速深入地学习编程竞赛。 本项目受[CTF Wiki](https://ctf-wiki.github.io/ctf-wiki/)的启发,在编写过程中参考了诸多资料,在此一并致谢。 diff --git a/docs/intro/about.md b/docs/intro/about.md index 405cd24c..3079e65a 100644 --- a/docs/intro/about.md +++ b/docs/intro/about.md @@ -2,31 +2,31 @@ Q:你们是为什么想要做这个 Wiki 的呢? -A:不知道你在学**OI**的时候,面对庞大的知识体系,有没有感到过迷茫无助的时候?**OI Wiki**想要做的事情可能类似于“让更多竞赛资源不充裕的同学能方便地接触到训练资源”。当然这么表述也不完全,做 Wiki 的动机可能也很纯粹,只是简单地想要对**OI**的发展做出一点点微小的贡献吧。XD +A:不知道你在学 **OI** 的时候,面对庞大的知识体系,有没有感到过迷茫无助的时候? **OI Wiki** 想要做的事情可能类似于“让更多竞赛资源不充裕的同学能方便地接触到训练资源”。当然这么表述也不完全,做 Wiki 的动机可能也很纯粹,只是简单地想要对 **OI** 的发展做出一点点微小的贡献吧。XD Q:我很感兴趣,怎么参与呢? -A:**OI Wiki**现在托管在[GitHub](https://github.com/24OI/OI-wiki)上,你可以直接访问这个[repo](https://github.com/24OI/OI-wiki)来查看最新进展。参与的途径包括在[GitHub](https://github.com/24OI/OI-wiki)上面开 Issue、Pull Request,或者在交流群中分享你的想法、直接向管理员投稿。目前,我们使用的框架是用 Python 开发的[mkdocs](https://mkdocs.readthedocs.io),支持 Markdown 格式(也支持插入数学公式)。 +A: **OI Wiki** 现在托管在[GitHub](https://github.com/24OI/OI-wiki)上,你可以直接访问这个[repo](https://github.com/24OI/OI-wiki)来查看最新进展。参与的途径包括在[GitHub](https://github.com/24OI/OI-wiki)上面开 Issue、Pull Request,或者在交流群中分享你的想法、直接向管理员投稿。目前,我们使用的框架是用 Python 开发的[mkdocs](https://mkdocs.readthedocs.io),支持 Markdown 格式(也支持插入数学公式)。 Q:可是我比较弱……不知道我能做点什么? -A:一切源于热爱。你可以协助其他人审核修改稿件,帮助我们宣传**OI Wiki**,为社区营造良好学习交流氛围! +A:一切源于热爱。你可以协助其他人审核修改稿件,帮助我们宣传 **OI Wiki** ,为社区营造良好学习交流氛围! Q:现在主要是谁在做这件事啊?感觉这是个大坑,真的能做好吗? -A:最开始主要是一些退役老年选手在做这件事,后来遇到了很多志同道合的小伙伴:有现役选手,退役玩家,也有从未参加过**OI**的朋友。目前,这个项目主要是由**OI Wiki**Team 来维护。(下面是一张合影) +A:最开始主要是一些退役老年选手在做这件事,后来遇到了很多志同道合的小伙伴:有现役选手,退役玩家,也有从未参加过 **OI** 的朋友。目前,这个项目主要是由 **OI Wiki** Team 来维护。(下面是一张合影) -当然,这个项目只靠我们的力量是很难做得十全十美的,我们诚挚地邀请你一起来完善**OI Wiki**。 +当然,这个项目只靠我们的力量是很难做得十全十美的,我们诚挚地邀请你一起来完善 **OI Wiki** 。 -Q:听说过 nocow 吧,**OI Wiki**怎么保证我们添加的内容不会像 nocow 那样突然间就不见了呢? +Q:听说过 nocow 吧, **OI Wiki** 怎么保证我们添加的内容不会像 nocow 那样突然间就不见了呢? A:我们把内容托管在[GitHub](https://github.com/24OI/OI-wiki)上面,即使我们的服务器翻车了,内容也不会丢失。另外,我们也会定期备份大家的心血,即使有一天[GitHub](https://github.com/24OI/OI-wiki)倒闭了(?),我们的内容也不会丢失。 -Q:**OI Wiki**好像现在大部分内容都是空的啊? +Q: **OI Wiki** 好像现在大部分内容都是空的啊? -A:是的,目前进度只完成了 78%(重新统计于 2019.02),还远远称不上是一个合格的 Wiki。在过去的几个月里,主要添加的内容也比较基础。所以在这里进行征稿和招募,希望可以遇到有同样想法的朋友,我们一起把**OI Wiki**完善起来。 +A:是的,目前进度只完成了 78%(重新统计于 2019.02),还远远称不上是一个合格的 Wiki。在过去的几个月里,主要添加的内容也比较基础。所以在这里进行征稿和招募,希望可以遇到有同样想法的朋友,我们一起把 **OI Wiki** 完善起来。 Q:为什么不直接去写[中文维基](https://zh.wikipedia.org/)呢? @@ -36,6 +36,6 @@ A:因为我们希望可以真正帮到更多的选手或者对这些内容感 感谢你看到了最后,我们现在急需的,就是你的帮助。 -**OI Wiki**Team + **OI Wiki** Team 2018.8 diff --git a/docs/intro/docker-deploy.md b/docs/intro/docker-deploy.md index 0d2c37de..3e7d346b 100644 --- a/docs/intro/docker-deploy.md +++ b/docs/intro/docker-deploy.md @@ -23,7 +23,7 @@ docker run -d -it [image] - 设置 `[image]` (必须)以设置镜像,如从 Docker Hub 拉取的则为 `24oi/oi-wiki` ,DaoCloud Hub 拉取的则为 `daocloud.io/sirius/oi-wiki` - 设置 `--name [name]` (默认空,若想查看容器 id,则输入 `docker ps` ,若设置请替换 `[name]` 为自定义的容器名字)以设置容器名字 -- 设置 `-p [port]:8000` (必须)(不写该语句则默认为不暴露端口,若设置请替换 `[port]` 为主机端口)以映射容器端口至主机端口(可以在主机使用 `http://127.0.0.1:[port]` 访问**OI Wiki**) +- 设置 `-p [port]:8000` (必须)(不写该语句则默认为不暴露端口,若设置请替换 `[port]` 为主机端口)以映射容器端口至主机端口(可以在主机使用 `http://127.0.0.1:[port]` 访问 **OI Wiki** ) ## 使用 diff --git a/docs/intro/editors.md b/docs/intro/editors.md index 39a50e97..62b75ecf 100644 --- a/docs/intro/editors.md +++ b/docs/intro/editors.md @@ -28,7 +28,7 @@ Vim 是一款非常优秀的文本编辑器,但由于其陡峭的学习曲线 Vim 依附于终端,所以调整终端设置也可以达到美化效果。比如背景透明这种极具美感的东西。而 Gvim 则可以通过图形界面的菜单栏来调节。 -Vim 确实是很方便的,而且各大系统基本上都有 Vim 版本,甚至对于许多 Linux 系统,Vim 本身就是自带的。但是自带的 Vim 很容易有功能残缺,比如不能与系统剪切板交互(将会在进阶篇讲解,当然主要是因为没安装其他东西啦),各种未开启支持。如果想要使用一些新版的功能的话(比如 Vim 内部调出终端以及自带的调试功能,当然,**如果没有相关要需要实是没有必要安装的**,可以直接往下走),那么这时候我们就需要手动安装。第一步先是卸载系统自带的 Vim,毕竟旧的不去新的不来嘛。命令如下: +Vim 确实是很方便的,而且各大系统基本上都有 Vim 版本,甚至对于许多 Linux 系统,Vim 本身就是自带的。但是自带的 Vim 很容易有功能残缺,比如不能与系统剪切板交互(将会在进阶篇讲解,当然主要是因为没安装其他东西啦),各种未开启支持。如果想要使用一些新版的功能的话(比如 Vim 内部调出终端以及自带的调试功能,当然, **如果没有相关要需要实是没有必要安装的** ,可以直接往下走),那么这时候我们就需要手动安装。第一步先是卸载系统自带的 Vim,毕竟旧的不去新的不来嘛。命令如下: ```bash sudo apt-get remove vim @@ -228,7 +228,7 @@ sudo vim /usr/share/X11/xkb/symbols/pc xmodmap -e 'clear Lock' -e 'keycode x042=Escape' ``` -当你能做到高速切换模式与熟练使用 hjkl 移动时,仅在想敲东西的时候进入插入模式并且敲完之后即刻推出就成了一种本能。其实你会发现o超级好用。现在很多时候我的换行并不是插入模式下的回车键,而是 ` o` 。而这也有另一个好处。这将会在**分块撤销**中得到体现。 +当你能做到高速切换模式与熟练使用 hjkl 移动时,仅在想敲东西的时候进入插入模式并且敲完之后即刻推出就成了一种本能。其实你会发现o超级好用。现在很多时候我的换行并不是插入模式下的回车键,而是 ` o` 。而这也有另一个好处。这将会在 **分块撤销** 中得到体现。 #### 重复!效率!重复! @@ -257,11 +257,11 @@ int check() { } ``` -后面五个赋值语句的数组名写错了肿么办?一个个改显然太坑了,而命令行模式的 `s` 命令又会**全部改掉**,那么怎么办呢?可以回忆一下我们普通模式下的 `s` 命令,它的作用是删除光标处字符并进入插入模式。那么怎么使用呢?来到第一个错误的数组名首字母处,按下 `4s` ,你会发现,数组名四个字符统统消失啦!然后输入正确的数组名再退出即可。之后?一个个把光标移过去再使用.就好啦。 +后面五个赋值语句的数组名写错了肿么办?一个个改显然太坑了,而命令行模式的 `s` 命令又会 **全部改掉** ,那么怎么办呢?可以回忆一下我们普通模式下的 `s` 命令,它的作用是删除光标处字符并进入插入模式。那么怎么使用呢?来到第一个错误的数组名首字母处,按下 `4s` ,你会发现,数组名四个字符统统消失啦!然后输入正确的数组名再退出即可。之后?一个个把光标移过去再使用.就好啦。 -**但是**,这还不够优雅,移动光标太浪费时间了!那么有什么办法嘛?答案是显然的。我们可以使用查找模式! `/book` 再按下回车,并使用 `n` 键来到第四个数组名处,然后 `4s 新数组名 ` ,接着我们只需要重复 `n.` 就行了 (O#O),是不是灰常优雅! + **但是** ,这还不够优雅,移动光标太浪费时间了!那么有什么办法嘛?答案是显然的。我们可以使用查找模式! `/book` 再按下回车,并使用 `n` 键来到第四个数组名处,然后 `4s 新数组名 ` ,接着我们只需要重复 `n.` 就行了 (O#O),是不是灰常优雅! -**再但是**,其实如果你开启了搜索结果高亮的选项,查找模式其实蛮难看的,这里我们引入一个新的轻便型查找命令 -- `f` !使用很简单,在一行中普通模式下, `f + 单个字符` 即可查找此行中出现的这个字符并将光标移至字符处,按 `;` 下一个, `,` 上一个。那么无需查找模式了,我们只需 `fb;;;` 之后进入插入模式修改,然后 `;.` 即可!所以这么说,对于行内移动,其实最常用的一般就几个命令: `h,l,0,$,f` ,而且 `$` 命令是可以被 `f` 替代的,那就是 `f;` 。所以.是不是炒鸡妙呀 (_OvO_)。 + **再但是** ,其实如果你开启了搜索结果高亮的选项,查找模式其实蛮难看的,这里我们引入一个新的轻便型查找命令 -- `f` !使用很简单,在一行中普通模式下, `f + 单个字符` 即可查找此行中出现的这个字符并将光标移至字符处,按 `;` 下一个, `,` 上一个。那么无需查找模式了,我们只需 `fb;;;` 之后进入插入模式修改,然后 `;.` 即可!所以这么说,对于行内移动,其实最常用的一般就几个命令: `h,l,0,$,f` ,而且 `$` 命令是可以被 `f` 替代的,那就是 `f;` 。所以.是不是炒鸡妙呀 (_OvO_)。 做个总结:.命令适用于重复的添加,修改,删除文本。就像一个自行车,踩起来蹭蹭的 = =。 diff --git a/docs/intro/faq.md b/docs/intro/faq.md index 6be7024a..c2474c4c 100644 --- a/docs/intro/faq.md +++ b/docs/intro/faq.md @@ -6,21 +6,21 @@ Telegram 群组链接为[@OIwiki](https://t.me/OIwiki),QQ 群号码为[ `58879 ## 贡献方式 -**我们现在在使用[Projects](https://github.com/24OI/OI-wiki/projects),这里详细列举了正在做的事情以及待做事项。** + **我们现在在使用[Projects](https://github.com/24OI/OI-wiki/projects),这里详细列举了正在做的事情以及待做事项。** -**在开始编写一段内容之前,请查阅[Issues](https://github.com/24OI/OI-wiki/issues),确认没有别人在做相同的工作之后,** + **在开始编写一段内容之前,请查阅[Issues](https://github.com/24OI/OI-wiki/issues),确认没有别人在做相同的工作之后,** -**开个[新 issue](https://github.com/24OI/OI-wiki/issues/new)记录你要编写的内容。** + **开个[新 issue](https://github.com/24OI/OI-wiki/issues/new)记录你要编写的内容。** ### 我之前没怎么用过 GitHub -参与 Wiki 的编写**需要**一个 GitHub 账号,**不需要**高超的 GitHub 技巧。 +参与 Wiki 的编写 **需要** 一个 GitHub 账号, **不需要** 高超的 GitHub 技巧。 举个栗子,假如我想要修改一个页面内容,应该怎么操作呢? 1. 在 OI Wiki 网站上找到对应页面。 -2. 点击 正文右上方、目录左侧的**“编辑此页”**edit按钮。 -3. (应该已经跳转到了 GitHub 上的对应页面吧?)这时候右上方还会有一个**“编辑此页”**edit的按钮,点击它就可以在线编辑了。 +2. 点击 正文右上方、目录左侧的 **“编辑此页”** edit按钮。 +3. (应该已经跳转到了 GitHub 上的对应页面吧?)这时候右上方还会有一个 **“编辑此页”** edit的按钮,点击它就可以在线编辑了。 4. 写好了之后点下方的绿色按钮(Propose file change),可能会提示没有权限。不必担心!GitHub 会自动帮你 fork 一份项目的文件并创建 Pull Request。 5. 之后点上方的绿色按钮(Create pull request)后,再点一下出现的绿色按钮(Create pull request)。 6. 提交之后就可以等待他人合并或者指出还要修改的地方,当然你也可以给他人的 PR 提出修改意见,或者只是点赞/踩。如果有消息,会有邮件通知和/或网页上的提醒(取决于在你个人 Settings 中的设置)。 @@ -34,8 +34,8 @@ Telegram 群组链接为[@OIwiki](https://t.me/OIwiki),QQ 群号码为[ `58879 基本协作方式如下: 1. Fork 主仓库到自己的仓库中。 -2. 当想要贡献某部分内容时,请务必仔细查看**Issues**,以便确定是否有人已经开始了这项工作。当然,我们更希望你可以加入 QQ/Telegram 群组,方便交流。 -3. 在决定将内容推送到本仓库时,**请你首先拉取本仓库代码进行合并,自行处理好冲突,同时确保在本地可以正常生成文档**,然后再将分支 PR 到主仓库的 master 分支上。其中,PR 需要包含以下基本信息: +2. 当想要贡献某部分内容时,请务必仔细查看 **Issues** ,以便确定是否有人已经开始了这项工作。当然,我们更希望你可以加入 QQ/Telegram 群组,方便交流。 +3. 在决定将内容推送到本仓库时, **请你首先拉取本仓库代码进行合并,自行处理好冲突,同时确保在本地可以正常生成文档** ,然后再将分支 PR 到主仓库的 master 分支上。其中,PR 需要包含以下基本信息: 标题:本次 PR 的目的(做了什么工作,修复了什么问题); 内容:如果必要的话,请给出对修复问题的叙述。 @@ -57,20 +57,20 @@ Telegram 群组链接为[@OIwiki](https://t.me/OIwiki),QQ 群号码为[ `58879 ### 文档的合理性 -所谓合理性,指所编写的**内容**必须具有如下的特性: +所谓合理性,指所编写的 **内容** 必须具有如下的特性: - 由浅入深,内容的难度应该具有渐进性。 - 逻辑性,对于每类内容的撰写应该尽量包含以下的内容: - 原理,说明该内容对应的原理。 - 例子,给出 1 ~ 2 个典型的例子。 - - 题目,在该标题下,**只需要给出题目名字、题目链接**。 + - 题目,在该标题下, **只需要给出题目名字、题目链接** 。 ### 文档存储的格式 对于每类要编写的内容,对应的文档应该存储在合适的目录下。 - images,存储文档介绍时所使用的图片,位置为所添加的目录下(即格式为 `![](./images/xx.jpg)` )。 -- **文件名请务必都小写,以 `-` 分割,如 `file-name` 。** +- **文件名请务必都小写,以 `-` 分割,如 `file-name` 。** ## F.A.Q. @@ -183,7 +183,7 @@ pip install -U -r requirements.txt #### 我的数学公式怎么乱码了 -如果是行间公式(用的 `$$` ),目前已知的问题是需要在 `$$` 两侧留有空行,且 `$$` 要**单独**放在一行里(且不要在前加空格)。格式如下: +如果是行间公式(用的 `$$` ),目前已知的问题是需要在 `$$` 两侧留有空行,且 `$$` 要 **单独** 放在一行里(且不要在前加空格)。格式如下: ```text // 空行 diff --git a/docs/intro/judgers.md b/docs/intro/judgers.md index 81c37124..223cc22e 100644 --- a/docs/intro/judgers.md +++ b/docs/intro/judgers.md @@ -16,7 +16,7 @@ Ir1d 提供了一份 linux 下编译好的版本在[FreestyleOJ/Project_lemon](h Menci 提供了一份更新的版本在[Menci/Lemon](https://github.com/Menci/Lemon/)。 -**注意**macOS 下 Lemon 可能会出现内存测试不准确的情况,这是由于 mac 下没有一些 Linux 的监测工具,而 Lemon-Linux 也没有对于 macOS 的使用优化。 + **注意** macOS 下 Lemon 可能会出现内存测试不准确的情况,这是由于 mac 下没有一些 Linux 的监测工具,而 Lemon-Linux 也没有对于 macOS 的使用优化。 ### 自行编译 @@ -128,7 +128,7 @@ players/ (建了一些无聊的问题) -这一步**十分重要:**点击文件 - 保存!一定要保存,否则没有题目配置文件!每一次对题目配置的修改都要保存! +这一步 **十分重要:** 点击文件 - 保存!一定要保存,否则没有题目配置文件!每一次对题目配置的修改都要保存! 此时,打开考试文件夹,会发现有如下内容。 @@ -166,7 +166,7 @@ players/ 因为我取得编号是 `HL-001` ,所以会自动识别出“所属”一栏。如果不是 NOIP 规范的编号是识别不出来的。 -这个时候,要用**向上箭头**把测评第 0 场变为测评第 1 场,如果直接修改的话会识别失败。 +这个时候,要用 **向上箭头** 把测评第 0 场变为测评第 1 场,如果直接修改的话会识别失败。 然后选择右边的全选,再选择下面的评测选定选手,选择要测评的题目(有全部试题),等待测评结束即可。 diff --git a/docs/intro/non-traditional.md b/docs/intro/non-traditional.md index 52964759..e1b7dcc6 100644 --- a/docs/intro/non-traditional.md +++ b/docs/intro/non-traditional.md @@ -21,7 +21,7 @@ STDIO 交互(标准 I/O 交互)是 Codeforces、AtCoder 等在线平台的交互手段,也是 ICPC 系列赛事中的标准。[LOJ #559.「LibreOJ Round #9」ZQC 的迷宫](https://loj.ac/problem/559)是一道典型的 STDIO 交互题。[这里](https://codeforces.com/blog/entry/45307)是 Codeforces 的一个更加简要的说明。 -对于这类题目,选手只需像往常一样将询问写到标准输出,**刷新输出缓冲**后从标准输入读取结果。选手程序刷新输出缓冲后,通过管道连接它的测评程序(称为交互器)才能立刻接收到这些数据。在 C/C++ 中, `fflush(stdout)` 和 `std::cout << std::flush` 可以实现这个操作;Pascal 则是 `flush(output)` 。 +对于这类题目,选手只需像往常一样将询问写到标准输出, **刷新输出缓冲** 后从标准输入读取结果。选手程序刷新输出缓冲后,通过管道连接它的测评程序(称为交互器)才能立刻接收到这些数据。在 C/C++ 中, `fflush(stdout)` 和 `std::cout << std::flush` 可以实现这个操作;Pascal 则是 `flush(output)` 。 ### Grader 交互 @@ -46,7 +46,7 @@ STDIO 交互的一个明显优势在于它可以支持任何编程语言,但 ## 通信题 -在通信题中,选手需要编写**两个**程序,合作完成某项任务。第一个程序接收问题的输入,并产生某些输出;第二个程序的输入会与第一个的输出相关(有时是原封不动地作为一个参数,有时会由评测端处理得到),它需要产生问题的解。[UOJ #178. 新年的贺电](http://uoj.ac/problem/178)和[#454.【UER #8】打雪仗](http://uoj.ac/problem/454)都是典型的通信题。 +在通信题中,选手需要编写 **两个** 程序,合作完成某项任务。第一个程序接收问题的输入,并产生某些输出;第二个程序的输入会与第一个的输出相关(有时是原封不动地作为一个参数,有时会由评测端处理得到),它需要产生问题的解。[UOJ #178. 新年的贺电](http://uoj.ac/problem/178)和[#454.【UER #8】打雪仗](http://uoj.ac/problem/454)都是典型的通信题。 本地测试的方法由于题目设定的不同而多种多样,常用的如: diff --git a/docs/intro/spj.md b/docs/intro/spj.md index e52196f5..3d2696ee 100644 --- a/docs/intro/spj.md +++ b/docs/intro/spj.md @@ -41,7 +41,7 @@ int main(int argc, char *argv[]) { ## Lemon -**Lemon 有现成的修改版 Testlib,建议使用 Testlib,见[Testlib](#testlib)** + **Lemon 有现成的修改版 Testlib,建议使用 Testlib,见[Testlib](#testlib)** ```cpp #include @@ -195,7 +195,7 @@ int main(int argc, char* argv[]) { ## LibreOJ(SYZOJ 2) -**LibreOJ(SYZOJ 2) 有现成的修改版 Testlib,建议使用 Testlib,见[Testlib](#testlib)** + **LibreOJ(SYZOJ 2) 有现成的修改版 Testlib,建议使用 Testlib,见[Testlib](#testlib)** ```cpp #include diff --git a/docs/intro/testlib/checker.md b/docs/intro/testlib/checker.md index f976272d..6e98d554 100644 --- a/docs/intro/testlib/checker.md +++ b/docs/intro/testlib/checker.md @@ -34,7 +34,7 @@ int main(int argc, char* argv[]) { 假设你有一道题输入输出均有很多数,如:给定一张 DAG,求 $s$ 到 $t$ 的最长路并输出路径(可能有多条,输出任一)。 -下面是一个**不好**的 checker 的例子。 +下面是一个 **不好** 的 checker 的例子。 ### 不好的实现 @@ -194,7 +194,7 @@ int main(int argc, char* argv[]) { ``` ???+ warning - 请在 `readAns` 中避免调用**全局**函数 `::ensure/ensuref()` ,这会导致在某些应判为 Wrong Answer 的选手输出下返回 `_fail` ,产生错误。 + 请在 `readAns` 中避免调用 **全局** 函数 `::ensure/ensuref()` ,这会导致在某些应判为 Wrong Answer 的选手输出下返回 `_fail` ,产生错误。 ## 建议与常见错误 @@ -232,4 +232,4 @@ int main(int argc, char* argv[]) { - 使用项别名 -**本文翻译自[Checkers with testlib.h - Codeforces](https://codeforces.com/blog/entry/18431)。 `testlib.h` 的 GitHub 存储库为[MikeMirzayanov/testlib](https://github.com/MikeMirzayanov/testlib)。** + **本文翻译自[Checkers with testlib.h - Codeforces](https://codeforces.com/blog/entry/18431)。 `testlib.h` 的 GitHub 存储库为[MikeMirzayanov/testlib](https://github.com/MikeMirzayanov/testlib)。** diff --git a/docs/intro/testlib/general.md b/docs/intro/testlib/general.md index 804b6944..128885d0 100644 --- a/docs/intro/testlib/general.md +++ b/docs/intro/testlib/general.md @@ -100,4 +100,4 @@ ensuref(s.length() % 2 == 0, 成员函数 `InStream::ensure/ensuref()` 一般用于判断选手和参考程序的输出是否合法。当 `Stream` 为 `ouf` 时,返回 `_wa`;为 `inf`(一般不使用)或 `ans` 时,返回 `_fail`。详见 [Checker - 编写 readAns 函数](/intro/testlib/checker/#_3)。 -**本文翻译并综合自[Testlib - Codeforces](https://codeforces.com/testlib)系列。 `testlib.h` 的 GitHub 存储库为[MikeMirzayanov/testlib](https://github.com/MikeMirzayanov/testlib)。** + **本文翻译并综合自[Testlib - Codeforces](https://codeforces.com/testlib)系列。 `testlib.h` 的 GitHub 存储库为[MikeMirzayanov/testlib](https://github.com/MikeMirzayanov/testlib)。** diff --git a/docs/intro/testlib/generator.md b/docs/intro/testlib/generator.md index 987ac237..5b28596d 100644 --- a/docs/intro/testlib/generator.md +++ b/docs/intro/testlib/generator.md @@ -20,7 +20,7 @@ int main(int argc, char* argv[]) { ## 为什么要使用 Testlib? -有人说写 generator 不需要用 Teslib,它在这没什么用。实际上这是个不正确的想法。一个好的 generator 应该满足这一点:**在任何环境下对于相同输入它给出相同输出**。写 generator 就避免不了生成随机值,平时我们用的 `rand()` 或 C++11 的 `mt19937/uniform_int_distribution` ,当操作系统不同、使用不同编译器编译、不同时间运行等,它们的输出都可能不同(对于非常常用的 `srand(time(0))` ,这是显然的),而这就会给生成数据带来不确定性。 +有人说写 generator 不需要用 Teslib,它在这没什么用。实际上这是个不正确的想法。一个好的 generator 应该满足这一点: **在任何环境下对于相同输入它给出相同输出** 。写 generator 就避免不了生成随机值,平时我们用的 `rand()` 或 C++11 的 `mt19937/uniform_int_distribution` ,当操作系统不同、使用不同编译器编译、不同时间运行等,它们的输出都可能不同(对于非常常用的 `srand(time(0))` ,这是显然的),而这就会给生成数据带来不确定性。 而 Testlib 中的随机值生成函数则保证了相同调用会输出相同值,与 generator 本身或平台均无关。另外。它给生成各种要求的随机值提供了很大便利,如 `rnd.next("[a-z]{1,10}")` 会生成一个长度在 $[1,10]$ 范围内的串,每个字符为 `a` 到 `z` ,很方便吧! @@ -98,4 +98,4 @@ for (int i = 0; i + 1 < n; i++) 可以在[GitHub](https://github.com/MikeMirzayanov/testlib/tree/master/generators)中找到。 -**本文翻译自[Генераторы на testlib.h - Codeforces](https://codeforces.com/blog/entry/18291)。 `testlib.h` 的 GitHub 存储库为[MikeMirzayanov/testlib](https://github.com/MikeMirzayanov/testlib)。** + **本文翻译自[Генераторы на testlib.h - Codeforces](https://codeforces.com/blog/entry/18291)。 `testlib.h` 的 GitHub 存储库为[MikeMirzayanov/testlib](https://github.com/MikeMirzayanov/testlib)。** diff --git a/docs/intro/testlib/index.md b/docs/intro/testlib/index.md index 4623458b..05a2a071 100644 --- a/docs/intro/testlib/index.md +++ b/docs/intro/testlib/index.md @@ -13,4 +13,4 @@ Testlib 与 Codeforces 开发的[Polygon](https://polygon.codeforces.com/)出题 `testlib.h` 在 2005 年移植自 `testlib.pas` ,并一直在更新。Testlib 与绝大多数编译器兼容,如 VC++ 和 GCC g++,并兼容 C++11。 -**本文翻译自[Testlib - Codeforces](https://codeforces.com/testlib)。 `testlib.h` 的 GitHub 存储库为[MikeMirzayanov/testlib](https://github.com/MikeMirzayanov/testlib)。** + **本文翻译自[Testlib - Codeforces](https://codeforces.com/testlib)。 `testlib.h` 的 GitHub 存储库为[MikeMirzayanov/testlib](https://github.com/MikeMirzayanov/testlib)。** diff --git a/docs/intro/testlib/validator.md b/docs/intro/testlib/validator.md index fd7d63c7..9b38e0bf 100644 --- a/docs/intro/testlib/validator.md +++ b/docs/intro/testlib/validator.md @@ -42,4 +42,4 @@ int main(int argc, char* argv[]) { ???+ warning Validator 是非常严格的,它需要保证有正确的空格或换行。例如当你读入一个整数时,当前流指针位置为一个空格后接一个整数,Testlib 仍将抛出错误。 -**本文翻译自[Validators with testlib.h - Codeforces](https://codeforces.com/blog/entry/18426)。 `testlib.h` 的 GitHub 存储库为[MikeMirzayanov/testlib](https://github.com/MikeMirzayanov/testlib)。** + **本文翻译自[Validators with testlib.h - Codeforces](https://codeforces.com/blog/entry/18426)。 `testlib.h` 的 GitHub 存储库为[MikeMirzayanov/testlib](https://github.com/MikeMirzayanov/testlib)。** diff --git a/docs/intro/wsl.md b/docs/intro/wsl.md index d9704087..3e386a9e 100644 --- a/docs/intro/wsl.md +++ b/docs/intro/wsl.md @@ -23,7 +23,7 @@ 虽然在 NOI 的官网已经放出了 NOI Linux 的 ISO 镜像,但是如果跑虚拟机的话,配置也相当麻烦,包括激活 VMware,用 VMware 装系统开虚拟机等步骤,且 NOI Linux 默认自带图形界面,两个系统一起运行是低配党的噩梦。 Windows 10 作为微软的新一代操作系统,紧跟时代潮流,在一周年更新时推出了 Linux 子系统(WSL),可以供装不起 VMware 等虚拟机的同学食用。 -缺点是没有 NOI 评测用的**Arbiter**,但是在各大 OJ 背书的情况下谁在乎呢…… +缺点是没有 NOI 评测用的 **Arbiter** ,但是在各大 OJ 背书的情况下谁在乎呢…… ???+ note "补充资料:何为 Linux 子系统(WSL)?(via 百度百科)" Windows Subsystem for Linux(简称 WSL)是一个为在 Windows 10 上能够原生运行 Linux 二进制可执行文件(ELF 格式)的兼容层。它是由微软与 Canonical 公司合作开发,目标是使纯正的 Ubuntu, OpenSUSE, Kali Linux 和 Debian 映像能下载和解压到用户的本地计算机,并且映像内的工具和实用工具能在此子系统上原生运行。 WSL 提供了一个微软开发的 Linux 兼容内核接口(不包含 Linux 代码),来自 Linux 的用户模式二进制文件在其上运行。 @@ -48,17 +48,17 @@ WSL 提供了一个微软开发的 Linux 兼容内核接口(不包含 Linux ???+ warning Windows 10 商店的第一个 Ubuntu 随着 Ubuntu 的更新而更新,因此内容可能会有所改变。 可使用 `sudo lsb_release -a` 查看自己的 Ubuntu 版本。 - 也可安装带有版本号的旧 Linux 版本(如本次演示使用了**16.04**)。 + 也可安装带有版本号的旧 Linux 版本(如本次演示使用了 **16.04** )。 安装完后,打开 Ubuntu,等待一段时间,让其自己配置,不久就会提示你设置用户名和密码。 -(这里看你喜好,推荐设置短点,毕竟**本地环境不怕攻击**) +(这里看你喜好,推荐设置短点,毕竟 **本地环境不怕攻击** ) -**Linux 区分大小写!** + **Linux 区分大小写!** ![](./images/WSL6.png)这样之后,一个纯净的 Ubuntu 系统安装完成了! ## 基础配置 -**以下命令均可直接右键复制粘贴进窗口哦!** + **以下命令均可直接右键复制粘贴进窗口哦!** ![](./images/WSL7.png)正如图片所示,这个系统纯净到连个编译器都没有,所以这一节来看看基础的环境配置。 @@ -69,8 +69,8 @@ Ubuntu 默认的软件源在国外,我们可以换为国内的加快速度, 可以访问[TUNA 的页面](https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/)来获得国内源的信息。 ???+ warning -**请在页面中寻找与自己系统版本相配的源(可使用 `sudo lsb_release -a` 查看,具体详见 `0x03` ) -**除非你知道你在做什么,否则不要使用与自己的系统版本不匹配的源!\*\* + **请在页面中寻找与自己系统版本相配的源(可使用 `sudo lsb_release -a` 查看,具体详见 `0x03` ) +** 除非你知道你在做什么,否则不要使用与自己的系统版本不匹配的源!\*\* 使用的命令 @@ -134,7 +134,7 @@ $ ./cpuid AMD Ryzen 5 1400 Quad-Core Processor ``` -**Tips:Linux 环境下可执行文件可不带扩展名,实现方式看上方命令行** + **Tips:Linux 环境下可执行文件可不带扩展名,实现方式看上方命令行** ## 进阶操作 @@ -190,7 +190,7 @@ sudo apt-get install xterm -y DISPLAY=:0 xterm ``` -**Duang!** + **Duang!** ![](./images/WSL18.png) 不过貌似只支持命令行……这时上一种方法的优势就显而易见了 如果你和我一样使用了 xfce4,在弹出的窗口中使用如下命令激活 xfce4: @@ -200,7 +200,7 @@ xfce4-session ``` ![](./images/WSL19.png) -不过这是什么效果……**(在 Xming 中使用**Ctrl+C**就可以退出这个鬼畜界面)** +不过这是什么效果…… **(在 Xming 中使用** Ctrl+C **就可以退出这个鬼畜界面)** ![](./images/WSL20.png)
达成成就:Windows+Linux 二合一
diff --git a/docs/math/bignum.md b/docs/math/bignum.md index d1994cfa..7f08045d 100644 --- a/docs/math/bignum.md +++ b/docs/math/bignum.md @@ -25,7 +25,7 @@ 在平常的实现中,高精度数字利用字符串表示,每一个字符表示数字的一个十进制位。因此可以说,高精度数值计算实际上是一种特别的字符串处理。 -读入字符串时,数字最高位在字符串首(下标小的位置)。但是习惯上,下标最小的位置存放的是数字的**最低位**,即存储反转的字符串。这么做的原因在于,数字的长度可能发生变化,但我们希望同样权值位始终保持对齐(例如,希望所有的个位都在下标 `[0]` ,所有的十位都在下标 `[1]` ……);同时,加、减、乘的运算一般都从个位开始进行(回想小学的竖式运算~),这都给了「反转存储」以充分的理由。 +读入字符串时,数字最高位在字符串首(下标小的位置)。但是习惯上,下标最小的位置存放的是数字的 **最低位** ,即存储反转的字符串。这么做的原因在于,数字的长度可能发生变化,但我们希望同样权值位始终保持对齐(例如,希望所有的个位都在下标 `[0]` ,所有的十位都在下标 `[1]` ……);同时,加、减、乘的运算一般都从个位开始进行(回想小学的竖式运算~),这都给了「反转存储」以充分的理由。 此后我们将一直沿用这一约定。定义一个常数 `LEN = 1004` 表示程序所容纳的最大长度。 diff --git a/docs/math/bsgs.md b/docs/math/bsgs.md index 0295a65d..e4a882a2 100644 --- a/docs/math/bsgs.md +++ b/docs/math/bsgs.md @@ -2,7 +2,7 @@ ### 基础篇 -大步小步算法英文名:**baby-step gaint-step (BSGS)**. +大步小步算法英文名: **baby-step gaint-step (BSGS)** . 该算法可以在 $O(\sqrt{q})$ 用于求解 @@ -32,43 +32,43 @@ $$ 其中 $p$ 是个质数。 -该模型可以通过一系列的转化为成**基础篇**中的模型,你可能需要一些关于[原根](/math/primitive-root/)的概念。 +该模型可以通过一系列的转化为成 **基础篇** 中的模型,你可能需要一些关于[原根](/math/primitive-root/)的概念。 -**原根的定义**为:对于任意数 $a$ ,满足 $(a,p)=1$ ,且 $t$ 为最小的**正整数**满足 $a^t \equiv 1 \bmod p$ ,则称 $t$ 是 $a$ 模 $p$ 意义下的次数,若 $t=\varphi(p)$ ,则称 $a$ 是 $p$ 的原根。 + **原根的定义** 为:对于任意数 $a$ ,满足 $(a,p)=1$ ,且 $t$ 为最小的 **正整数** 满足 $a^t \equiv 1 \bmod p$ ,则称 $t$ 是 $a$ 模 $p$ 意义下的次数,若 $t=\varphi(p)$ ,则称 $a$ 是 $p$ 的原根。 -首先根据**原根存在的条件**,对与所有的素数 $p>2$ 和正整数 $e$ ,当且仅当 $n=1,2,4,p^e,2p^e$ 时有原根, +首先根据 **原根存在的条件** ,对与所有的素数 $p>2$ 和正整数 $e$ ,当且仅当 $n=1,2,4,p^e,2p^e$ 时有原根, 那么由于式子中的模数 $p$ ,那么一定存在一个 $g$ 满足 $g$ 是 $p$ 的原根,即对于任意的数 $x$ 在模 $p$ 意义下一定有且仅有一个数 $i$ ,满足 $x = g^i$ ,且 $0 \le x,i < p$ . -所以我们令 $x=g^c$ , $g$ 是 $p$ 的原根(我们一定可以找到这个 $g$ 和 $c$ ),则为求 $(g^c)^a \equiv b \bmod p$ 的关于 $c$ 的解集,稍加变换,则有 $(g^a)^c \equiv b \bmod p$ ,于是就转换成了我们熟知的**BSGS**的基本模型了,即可在 $O(\sqrt p)$ 解决。 +所以我们令 $x=g^c$ , $g$ 是 $p$ 的原根(我们一定可以找到这个 $g$ 和 $c$ ),则为求 $(g^c)^a \equiv b \bmod p$ 的关于 $c$ 的解集,稍加变换,则有 $(g^a)^c \equiv b \bmod p$ ,于是就转换成了我们熟知的 **BSGS** 的基本模型了,即可在 $O(\sqrt p)$ 解决。 那么关键的问题就在于如何找到这个 $g$ 了? -关于对于存在原根的数 $p$ 有这样的**性质**:若 $t$ 是 $a$ 模 $p$ 的次数(这里蕴含了 $(a,p)=1$ ),那么对于任意的数 $d$ ,满足 $a^d \equiv 1 \bmod p$ ,则 $t \mid d$ . +关于对于存在原根的数 $p$ 有这样的 **性质** :若 $t$ 是 $a$ 模 $p$ 的次数(这里蕴含了 $(a,p)=1$ ),那么对于任意的数 $d$ ,满足 $a^d \equiv 1 \bmod p$ ,则 $t \mid d$ . -**PROOF** + **PROOF** 记 $d = tq+r$ , $0 \le r < t$ . $\because a^d \equiv a^{xq+r} \equiv (a^t)^qa^r \equiv a^r \equiv 1$ . - $\because 0 \le r < t$ , $t$ 是 $a$ 模 $p$ 的次数,即 $t$ 是最小的**正整数**满足 $a^t \equiv 1$ . + $\because 0 \le r < t$ , $t$ 是 $a$ 模 $p$ 的次数,即 $t$ 是最小的 **正整数** 满足 $a^t \equiv 1$ . $\therefore r = 0$ . 即 $d = tq$ , $t \mid d$ -**Q.E.D.** + **Q.E.D.** -由此当 $p$ 是质数的时候还有这样的推论:如果不存在小于 $p$ 且整除 $p-1$ 正整数 $t$ , 满足 $a^t \equiv 1$ ,那么又根据**费马小定理**,有 $a^{p-1} \equiv 1$ ,所以 $p-1$ 是 $a$ 模 $p$ 的次数,即 $a$ 是 $p$ 的原根。 +由此当 $p$ 是质数的时候还有这样的推论:如果不存在小于 $p$ 且整除 $p-1$ 正整数 $t$ , 满足 $a^t \equiv 1$ ,那么又根据 **费马小定理** ,有 $a^{p-1} \equiv 1$ ,所以 $p-1$ 是 $a$ 模 $p$ 的次数,即 $a$ 是 $p$ 的原根。 -于是可以得到一种基于**原根分布**的算法来找原根,首先把 $p-1$ 的因数全部求出来,然后从 $2$ 到 $p-1$ 枚举,判断是否为原根,如果对于数 $g$ , $\exists g^t \equiv 1 \bmod p$ , $t$ 是 $p-1$ 的因数,则 $g$ 一定不是 $p$ 的原根。 +于是可以得到一种基于 **原根分布** 的算法来找原根,首先把 $p-1$ 的因数全部求出来,然后从 $2$ 到 $p-1$ 枚举,判断是否为原根,如果对于数 $g$ , $\exists g^t \equiv 1 \bmod p$ , $t$ 是 $p-1$ 的因数,则 $g$ 一定不是 $p$ 的原根。 看上去复杂度好像很爆炸(可能确实是爆炸的,但一般情况下,最小的原根不会很大)。 -~~基于一个**假设**,原联系根是**均匀分布**的,我们**伪证明**一下总复杂度~~:原根数量定理:数 $p$ 要么没有原根,要么有 $\varphi(\varphi(p))$ 个原根。 +~~基于一个 **假设** ,原联系根是 **均匀分布** 的,我们 **伪证明** 一下总复杂度~~:原根数量定理:数 $p$ 要么没有原根,要么有 $\varphi(\varphi(p))$ 个原根。 -由于 $p$ 是质数,所以 $p$ 有 $\varphi(p-1)$ 个原根,所以大概最小的原根为 $\frac{p}{\varphi(p-1)}=O(\log\log n)$ ,由于求每一个数时要枚举一遍 $p-1$ 所有的因数 $O(\sqrt p)$ 来判断其是否为原根,最后再算上**BSGS**的复杂度 $O(\sqrt{p})$ ,则复杂度约为 $O(\sqrt{p}\log \log n)$ . +由于 $p$ 是质数,所以 $p$ 有 $\varphi(p-1)$ 个原根,所以大概最小的原根为 $\frac{p}{\varphi(p-1)}=O(\log\log n)$ ,由于求每一个数时要枚举一遍 $p-1$ 所有的因数 $O(\sqrt p)$ 来判断其是否为原根,最后再算上 **BSGS** 的复杂度 $O(\sqrt{p})$ ,则复杂度约为 $O(\sqrt{p}\log \log n)$ . [BZOJ-1319](http://www.lydsy.com/JudgeOnline/problem.php?id=1319)是一道模板题,代码可以在[Steaunk 的博客](https://blog.csdn.net/Steaunk/article/details/78988376)中看到。 diff --git a/docs/math/cantor.md b/docs/math/cantor.md index deef18b8..62f297a8 100644 --- a/docs/math/cantor.md +++ b/docs/math/cantor.md @@ -16,11 +16,11 @@ ## 举个栗子 -我们知道长为 $5$ 的排列 $[2,5,3,4,1]$ 大于以 $1$ 为第一位的任何排列,以 $1$ 为第一位的 $5$ 的排列有 $4!$ 种。这是非常好理解的。但是我们对第二位的 $5$ 而言,它大于**第一位与这个排列相同的,而这一位比 $5$ 小的**所有排列。不过我们要注意的是,这一位不仅要比 $5$ 小,还要满足没有在当前排列的前面出现过,不然统计就重复了。因此这一位为 $1,3$ 或 $4$ ,第一位为 $2$ 的所有排列都比它要小,数量为 $3\times 3!$ 。 +我们知道长为 $5$ 的排列 $[2,5,3,4,1]$ 大于以 $1$ 为第一位的任何排列,以 $1$ 为第一位的 $5$ 的排列有 $4!$ 种。这是非常好理解的。但是我们对第二位的 $5$ 而言,它大于 **第一位与这个排列相同的,而这一位比 $5$ 小的** 所有排列。不过我们要注意的是,这一位不仅要比 $5$ 小,还要满足没有在当前排列的前面出现过,不然统计就重复了。因此这一位为 $1,3$ 或 $4$ ,第一位为 $2$ 的所有排列都比它要小,数量为 $3\times 3!$ 。 按照这样统计下去,答案就是 $1+4!+3\times 3!+2!+1=46$ 。注意我们统计的是排名,因此最前面要 $+1$ 。 -注意到我们每次要用到**当前有多少个小于它的数还没有出现**,这里用树状数组统计比它小的数出现过的次数就可以了。 +注意到我们每次要用到 **当前有多少个小于它的数还没有出现** ,这里用树状数组统计比它小的数出现过的次数就可以了。 ## 逆康托展开 @@ -38,4 +38,4 @@ 让 $3-1\times 2!=1$ ,有一个数小于它,这一位是剩下来的第二位, $4$ ,剩下一位就是 $1$ 。即 $[2,5,3,4,1]$ 。 -实际上我们得到了形如**有两个数小于它**这一结论,就知道它是当前第 $3$ 个没有被选上的数,这里也可以用线段树维护,时间复杂度为 $O(n\log n)$ 。 +实际上我们得到了形如 **有两个数小于它** 这一结论,就知道它是当前第 $3$ 个没有被选上的数,这里也可以用线段树维护,时间复杂度为 $O(n\log n)$ 。 diff --git a/docs/math/combination.md b/docs/math/combination.md index 6cf3db58..adbab987 100644 --- a/docs/math/combination.md +++ b/docs/math/combination.md @@ -18,7 +18,7 @@ $$ A_n^m = n(n-1)(n-2) \cdots (n-m+1) = \frac{n!}{(n - m)!} $$ -** $n!$ 代表 $n$ 的阶乘,即 $6! = 1 \times 2 \times 3 \times 4 \times 5 \times 6$ .** + ** $n!$ 代表 $n$ 的阶乘,即 $6! = 1 \times 2 \times 3 \times 4 \times 5 \times 6$ .** ### 组合的定义 @@ -34,14 +34,14 @@ $$ ### 排列 -**全排列**: + **全排列** : $n$ 个人全部来排队,队长为 $n$ 。第一个位置可以选 $n$ 个,第二位置可以选 $n-1$ 个,以此类推得: $$ A_n^n = n(n-1)(n-2) \cdots 3 × 2 × 1 = n! $$ -**部分排列**: + **部分排列** : $n$ 个人选 $m$ 个来排队 ( $m \le n$ )。第一个位置可以选 $n$ 个,第二位置可以选 $n-1$ 个,以此类推,第 $m$ 个(最后一个)可以选 $n-m+1$ 个,得: $$ @@ -81,7 +81,7 @@ $$ Q_n^n \times n = A_n^n → Q_n = \frac{A_n^n}{n} = (n-1)! $$ -**由此可知:部分圆排** + **由此可知:部分圆排** $$ Q_n^r = \frac{A_n^r}{r} = \frac{n!}{r \times (n-r)!} @@ -113,7 +113,7 @@ $$ 1 \le b_1 < b_2+1 < b_3+2 < b_4+3 < \cdots < b_k+k-1 \le n+k-1 $$ -中间还是 $k$ 个数!不过已经不是 $b$ 系列,而是 $c$ 系列,**假设 $c[i]=b[i]+i-1$ ,所以** +中间还是 $k$ 个数!不过已经不是 $b$ 系列,而是 $c$ 系列, **假设 $c[i]=b[i]+i-1$ ,所以** $$ 1 \le c_1 < c_2 < c_3 < c_4 < \cdots < c_k \le n+k-1 @@ -136,7 +136,7 @@ $$ 这就是错排问题。当 $n=3$ 时,只能为 312 或 231 这两种。 -那么错排问题的解题思路是什么呢?我们以第二个问题为例:**递推还是王道!** +那么错排问题的解题思路是什么呢?我们以第二个问题为例: **递推还是王道!** 刚开始所有球员都住在和自己编号一样的房间里面。然后错排开始了,第 $n$ 个球员从第 $n$ 个房间出来。 @@ -176,7 +176,7 @@ $$ ### 两原理的区别 -**一个与分类有关,一个与分步有关;加法原理是“分类完成”,乘法原理是“分步完成”。** + **一个与分类有关,一个与分步有关;加法原理是“分类完成”,乘法原理是“分步完成”。** ## 几个关于组合的公式 diff --git a/docs/math/complex.md b/docs/math/complex.md index 5956659a..3bf127f7 100644 --- a/docs/math/complex.md +++ b/docs/math/complex.md @@ -18,15 +18,15 @@ 那么这样的性质就与实数域类似了,我们把所有有着 $a+b\text{i}$ 形式的数放入一个集合中,就出现了复数集 $\mathbb{C}=\{a+b\text{i} \mid a,b\in \mathbb{R}\}$ 。 -我们可以发现,这个集合中的数和实数集中的数类似,都有在集合中任选两个数进行四则运算,得到的数都是原集合中的数的性质。我们说复数集对于四则运算是**封闭的**。 +我们可以发现,这个集合中的数和实数集中的数类似,都有在集合中任选两个数进行四则运算,得到的数都是原集合中的数的性质。我们说复数集对于四则运算是 **封闭的** 。 ### 复数的定义和分类 > 哇哦我们定义的数的性质这么好! -我们定义形如 $a+b\text{i}$ ,其中 $a,b\in \mathbb{R}$ 的数叫做**复数**,其中 $\text{i}$ 被称为**虚数单位**,全体复数的集合叫做**复数集**。 +我们定义形如 $a+b\text{i}$ ,其中 $a,b\in \mathbb{R}$ 的数叫做 **复数** ,其中 $\text{i}$ 被称为 **虚数单位** ,全体复数的集合叫做 **复数集** 。 -复数通常用 $z$ 表示,即 $z=a+b\text{i}$ 。这种形式被称为**复数的代数形式**。其中 $a$ 称为复数 $z$ 的**实部**, $b$ 称为复数 $z$ 的**虚部**。如无特殊说明,都有 $a,b\in \mathbb{R}$ 。 +复数通常用 $z$ 表示,即 $z=a+b\text{i}$ 。这种形式被称为 **复数的代数形式** 。其中 $a$ 称为复数 $z$ 的 **实部** , $b$ 称为复数 $z$ 的 **虚部** 。如无特殊说明,都有 $a,b\in \mathbb{R}$ 。 对于一个复数 $z$ ,当且仅当 $b=0$ 时,它是实数,当 $b\not = 0$ 时,它是虚数,当 $a=0$ 且 $b\not = 0$ 时,它是纯虚数。 @@ -45,17 +45,17 @@ 我们把所有实数都放在了数轴上,并且发现数轴上的点与实数一一对应。我们考虑对复数也这样处理。 -首先我们定义**复数相等**:两个复数 $z_1=a+b\text{i},z_2=c+d\text{i}$ 是相等的,当且仅当 $a=c$ 且 $b=d$ 。 +首先我们定义 **复数相等** :两个复数 $z_1=a+b\text{i},z_2=c+d\text{i}$ 是相等的,当且仅当 $a=c$ 且 $b=d$ 。 这么定义是十分自然的,在此不做过多解释。 -也就是说,我们可以用唯一的有序实数对 $(a,b)$ 表示一个复数 $z=a+b\text{i}$ 。这样,联想到平面直角坐标系,我们可以发现**复数集与平面直角坐标系中的点集一一对应**。好了,我们找到了复数的一种几何意义。 +也就是说,我们可以用唯一的有序实数对 $(a,b)$ 表示一个复数 $z=a+b\text{i}$ 。这样,联想到平面直角坐标系,我们可以发现 **复数集与平面直角坐标系中的点集一一对应** 。好了,我们找到了复数的一种几何意义。 -那么这个平面直角坐标系就不再一般,因为平面直角坐标系中的点具有了特殊意义——表示一个复数,所以我们把这样的平面直角坐标系称为**复平面**, $x$ 轴称为**实轴**, $y$ 轴称为**虚轴**。我们进一步地说:**复数集与复平面内所有的点所构成的集合是一一对应的**。 +那么这个平面直角坐标系就不再一般,因为平面直角坐标系中的点具有了特殊意义——表示一个复数,所以我们把这样的平面直角坐标系称为 **复平面** , $x$ 轴称为 **实轴** , $y$ 轴称为 **虚轴** 。我们进一步地说: **复数集与复平面内所有的点所构成的集合是一一对应的** 。 -我们考虑到学过的平面向量的知识,发现向量的坐标表示也是一个有序实数对 $(a,b)$ ,显然,复数 $z=a+b\text{i}$ 对应复平面内的点 $Z(a,b)$ ,那么它还对应平面向量 $\overrightarrow{OZ}=(a,b)$ ,于是我们又找到了复数的另一种几何意义:**复数集与复平面内的向量所构成的集合是一一对应的(实数 $0$ 与零向量对应)**。 +我们考虑到学过的平面向量的知识,发现向量的坐标表示也是一个有序实数对 $(a,b)$ ,显然,复数 $z=a+b\text{i}$ 对应复平面内的点 $Z(a,b)$ ,那么它还对应平面向量 $\overrightarrow{OZ}=(a,b)$ ,于是我们又找到了复数的另一种几何意义: **复数集与复平面内的向量所构成的集合是一一对应的(实数 $0$ 与零向量对应)** 。 -于是,我们由向量的知识迁移到复数上来,定义**复数的模**就是复数所对应的向量的模。复数 $z=a+b\text{i}$ 的模 $|z|=\sqrt{a^2+b^2}$ 。 +于是,我们由向量的知识迁移到复数上来,定义 **复数的模** 就是复数所对应的向量的模。复数 $z=a+b\text{i}$ 的模 $|z|=\sqrt{a^2+b^2}$ 。 于是为了方便,我们常把复数 $z=a+b\text{i}$ 称为点 $Z$ 或向量 $\overrightarrow {OZ}$ ,并规定相等的向量表示同一个复数。 @@ -77,7 +77,7 @@ $$ 考虑到向量的加法运算,我们发现复数的加法运算符合向量的加法运算法则,这同样证明了复数的几何意义的正确性。 -同样可以验证,**复数的加法满足交换律和结合律**。即: +同样可以验证, **复数的加法满足交换律和结合律** 。即: $$ z_1+z_2=z_2+z_1\\ @@ -112,7 +112,7 @@ $$ 复数的乘法与向量的向量积形式类似,是由于复数集是数环。 -于是容易知道,**复数乘法满足交换律,结合律和对加法的分配律**,即: +于是容易知道, **复数乘法满足交换律,结合律和对加法的分配律** ,即: $$ z_1z_2=z_2z_1\\ @@ -120,7 +120,7 @@ z_1z_2=z_2z_1\\ z_1(z_2+z_3)=z_1z_2+z_1z_3 $$ -由于满足运算律,我们可以发现实数域中的**乘法公式在复数域中同样适用**。 +由于满足运算律,我们可以发现实数域中的 **乘法公式在复数域中同样适用** 。 除法运算是乘法运算的逆运算,我们可以推导一下: @@ -133,6 +133,6 @@ $$ 为了分母实数化,我们乘了一个 $c-d\text{i}$ ,这个式子很有意义。 -我们定义,当两个虚数实部相等,虚部互为相反数时,这两个复数互为**共轭复数**。通常记 $z=a+b\text{i}$ 的共轭复数为 $\bar z=a-b\text{i}$ 。我们可以发现,两个复数互为共轭复数,那么它们**关于实轴对称**。 +我们定义,当两个虚数实部相等,虚部互为相反数时,这两个复数互为 **共轭复数** 。通常记 $z=a+b\text{i}$ 的共轭复数为 $\bar z=a-b\text{i}$ 。我们可以发现,两个复数互为共轭复数,那么它们 **关于实轴对称** 。 由于向量没有除法,这里不讨论与向量的关系。 diff --git a/docs/math/crt.md b/docs/math/crt.md index 77f44d03..594ca0d8 100644 --- a/docs/math/crt.md +++ b/docs/math/crt.md @@ -33,7 +33,7 @@ $$ 2. 对于第 $i$ 个方程: 1. 计算 $m_i=\frac{n}{n_i}$ ; 2. 计算 $m_i$ 在模 $n_i$ 意义下的[逆元](/math/inverse/) $m_i^{-1}$ ; - 3. 计算 $c_i=m_im_i^{-1}$ (**不要对 $n_i$ 取模**)。 + 3. 计算 $c_i=m_im_i^{-1}$ ( **不要对 $n_i$ 取模** )。 3. 方程组的唯一解为: $a=\sum_{i=1}^k a_ic_i \pmod n$ 。 ### 伪代码 @@ -65,27 +65,27 @@ a&\equiv \sum_{j=1}^k a_jc_j &\pmod {n_i} \\ \end{aligned} $$ -**即对于任意 $i=1,2,\cdots,k$ ,上面算法得到的 $a$ 总是满足 $a\equiv a_i \pmod{n_i}$ ,即证明了解同余方程组的算法的正确性。** + **即对于任意 $i=1,2,\cdots,k$ ,上面算法得到的 $a$ 总是满足 $a\equiv a_i \pmod{n_i}$ ,即证明了解同余方程组的算法的正确性。** 因为我们没有对输入的 $a_i$ 作特殊限制,所以任何一组输入 $\{a_i\}$ 都对应一个解 $a$ 。 另外,若 $x\neq y$ ,则总存在 $i$ 使得 $x$ 和 $y$ 在模 $n_i$ 下不同余。 -**故系数列表 $\{a_i\}$ 与解 $a$ 之间是一一映射关系,方程组总是有唯一解。** + **故系数列表 $\{a_i\}$ 与解 $a$ 之间是一一映射关系,方程组总是有唯一解。** ## 例 下面演示 CRT 如何解「物不知数」问题。 1. $n=3\times 5\times 7=105$ ; -2. 三人同行**七十**希: $n_1=3, m_1=n/n_1=35, m_1^{-1}\equiv 2\pmod 3$ ,故 $c_1=35\times 2=70$ ; -3. 五树梅花**廿一**支: $n_2=5, m_2=n/n_2=21, m_2^{-1}\equiv 1\pmod 5$ ,故 $c_2=21\times 1=21$ ; -4. 七子团圆正**半月**: $n_3=7, m_3=n/n_3=15, m_3^{-1}\equiv 1\pmod 7$ ,故 $c_3=15\times 1=15$ ; -5. 所以方程组的唯一解为 $a\equiv 2\times 70+3\times 21+2\times 15\equiv 233\equiv 23 \pmod {105}$ 。(除**百零五**便得知) +2. 三人同行 **七十** 希: $n_1=3, m_1=n/n_1=35, m_1^{-1}\equiv 2\pmod 3$ ,故 $c_1=35\times 2=70$ ; +3. 五树梅花 **廿一** 支: $n_2=5, m_2=n/n_2=21, m_2^{-1}\equiv 1\pmod 5$ ,故 $c_2=21\times 1=21$ ; +4. 七子团圆正 **半月** : $n_3=7, m_3=n/n_3=15, m_3^{-1}\equiv 1\pmod 7$ ,故 $c_3=15\times 1=15$ ; +5. 所以方程组的唯一解为 $a\equiv 2\times 70+3\times 21+2\times 15\equiv 233\equiv 23 \pmod {105}$ 。(除 **百零五** 便得知) ## 应用 -某些计数问题或数论问题出于加长代码、增加难度、或者是一些其他不可告人的原因,给出的模数:**不是质数**! +某些计数问题或数论问题出于加长代码、增加难度、或者是一些其他不可告人的原因,给出的模数: **不是质数** ! 但是对其质因数分解会发现它没有平方因子,也就是该模数是由一些不重复的质数相乘得到。 diff --git a/docs/math/du-sieves.md b/docs/math/du-sieves.md index f817ceef..5d104144 100644 --- a/docs/math/du-sieves.md +++ b/docs/math/du-sieves.md @@ -1,6 +1,6 @@ -在数论题目中,常常需要根据一些**积性函数**的性质,求出一些式子的值。 +在数论题目中,常常需要根据一些 **积性函数** 的性质,求出一些式子的值。 -**积性函数**:对于所有互质的 $a$ 和 $b$ ,总有 $f(ab)=f(a)f(b)$ ,则称 $f(x)$ 为积性函数。 + **积性函数** :对于所有互质的 $a$ 和 $b$ ,总有 $f(ab)=f(a)f(b)$ ,则称 $f(x)$ 为积性函数。 常见的积性函数有: @@ -26,13 +26,13 @@ 中的 $h(x)$ 也为积性函数。 -在莫比乌斯反演的题目中,往往要求出一些数论函数的前缀和,利用**杜教筛**可以快速求出这些前缀和。 +在莫比乌斯反演的题目中,往往要求出一些数论函数的前缀和,利用 **杜教筛** 可以快速求出这些前缀和。 ??? note " 例题[P4213【模板】杜教筛(Sum)](https://www.luogu.org/problemnew/show/P4213)" 题目大意:求 $S_1(n)= \sum_{i=1}^n \mu(i)$ 和 $S_2(n)= \sum_{i=1}^n \varphi(i)$ 的值, $n\le 2^{31} -1$ 。 -由**狄利克雷卷积**,我们知道: +由 **狄利克雷卷积** ,我们知道: $\because \epsilon =\mu * 1$ ( $\epsilon(n)=~[n=1]$ ) @@ -42,7 +42,7 @@ $= 1-\sum_{i=2}^n S_1(\lfloor \frac n i \rfloor)$ -观察到 $\lfloor \frac n i \rfloor$ 最多只有 $O(\sqrt n)$ 种取值,我们就可以应用**整除分块**(或称数论分块)来计算每一项的值了。 +观察到 $\lfloor \frac n i \rfloor$ 最多只有 $O(\sqrt n)$ 种取值,我们就可以应用 **整除分块** (或称数论分块)来计算每一项的值了。 直接计算的时间复杂度为 $O(n^{\frac 3 4})$ 。考虑先线性筛预处理出前 $n^{\frac 2 3}$ 项,剩余部分的时间复杂度为 diff --git a/docs/math/expectation.md b/docs/math/expectation.md index 6bdf49ea..f92a82dd 100644 --- a/docs/math/expectation.md +++ b/docs/math/expectation.md @@ -10,9 +10,9 @@ 因为事件在一定程度上是以集合的含义定义的,因此可以把集合计算方法直接应用于事件的计算,也就是说,在计算过程中,可以把事件当作集合来对待。 -**和事件**:相当于**并集**。只需其中之一发生,就发生了。 + **和事件** :相当于 **并集** 。只需其中之一发生,就发生了。 -**积事件**:相当于**交集**。必须要全都发生,才计算概率。 + **积事件** :相当于 **交集** 。必须要全都发生,才计算概率。 ## 概率 @@ -22,17 +22,17 @@ ### 公理 -**非负性**:对于一个事件 $A$ ,有概率 $P(A)\in [0,1]$ 。 + **非负性** :对于一个事件 $A$ ,有概率 $P(A)\in [0,1]$ 。 -**规范性**:事件空间的概率值为 $1$ , $P(S)=1$ . + **规范性** :事件空间的概率值为 $1$ , $P(S)=1$ . -**容斥性**:若 $P(A+B) = P(A)+P(B)$ ,则 $A$ 和 $B$ 互为独立事件。 + **容斥性** :若 $P(A+B) = P(A)+P(B)$ ,则 $A$ 和 $B$ 互为独立事件。 ### 计算 -**全概率公式**:若事件 $A_1,A_2,\ldots,A_n$ 构成一个完备的事件且都有正概率,即 $\forall i,j, A_i\cap A_j=\varnothing$ 且 $\displaystyle \sum_{i=1}^n A_i=1$ ,有 $\displaystyle P(B)=\sum_{i=1}^n P(A_i)P(B|A_i)$ 。 + **全概率公式** :若事件 $A_1,A_2,\ldots,A_n$ 构成一个完备的事件且都有正概率,即 $\forall i,j, A_i\cap A_j=\varnothing$ 且 $\displaystyle \sum_{i=1}^n A_i=1$ ,有 $\displaystyle P(B)=\sum_{i=1}^n P(A_i)P(B|A_i)$ 。 -**贝叶斯定理**: $\displaystyle P(B_i|A)=\frac{P(B_i)P(A|B_i)}{\displaystyle \sum_{j=1}^n P(B_j)P(A|B_j)}$ + **贝叶斯定理** : $\displaystyle P(B_i|A)=\frac{P(B_i)P(A|B_i)}{\displaystyle \sum_{j=1}^n P(B_j)P(A|B_j)}$ 公式中,事件 $B_i$ 的概率为 $P(B_i)$ ,事件 $B_i$ 已发生条件下事件 $A$ 的概率为 $P(A|B_i)$ ,事件 $A$ 发生条件下事件 $B_i$ 的概率为 $P(B_i|A)$ 。 @@ -44,9 +44,9 @@ ### 性质 -**全期望公式**: $E(Y)=E[E(Y|X)]$ 。可由全概率公式证明。 + **全期望公式** : $E(Y)=E[E(Y|X)]$ 。可由全概率公式证明。 -**线性性质**: 对于任意两个随机事件 $x,y$ (**不要求相互独立**),有 $E(X+Y)=E(X)+E(Y)$ 。 + **线性性质** : 对于任意两个随机事件 $x,y$ ( **不要求相互独立** ),有 $E(X+Y)=E(X)+E(Y)$ 。 ## 例题 diff --git a/docs/math/game-theory.md b/docs/math/game-theory.md index 874611f7..4e7a9d7b 100644 --- a/docs/math/game-theory.md +++ b/docs/math/game-theory.md @@ -1,4 +1,4 @@ -**博弈论**,是经济学的一个分支,主要研究具有竞争或对抗性质的对象,在一定规则下产生的各种行为。博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。 + **博弈论** ,是经济学的一个分支,主要研究具有竞争或对抗性质的对象,在一定规则下产生的各种行为。博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。 通俗地讲,博弈论主要研究的是:在一个游戏中,进行游戏的多位玩家的策略。 @@ -32,7 +32,7 @@ ![博弈图的例子](./images/game1.png) -定义**必胜状态**为**先手必胜的状态**,**必败状态**为**先手必败的状态**。 +定义 **必胜状态** 为 **先手必胜的状态** , **必败状态** 为 **先手必败的状态** 。 通过推理,我们可以得出下面三条定理: @@ -98,7 +98,7 @@ $$ \operatorname{SG}(x)=\operatorname{mex}\{\operatorname{SG}(y_1), \operatorname{SG}(y_2), \ldots, \operatorname{SG}(y_k)\} $$ -而对于由 $n$ 个有向图游戏组成的组合游戏,设它们的起点分别为 $s_1, s_2, \ldots, s_n$ ,则有定理:**当且仅当 $\operatorname{SG}(s_1) \oplus \operatorname{SG}(s_2) \oplus \ldots \oplus \operatorname{SG}(s_n) \neq 0$ 时,这个游戏是先手必胜的。** +而对于由 $n$ 个有向图游戏组成的组合游戏,设它们的起点分别为 $s_1, s_2, \ldots, s_n$ ,则有定理: **当且仅当 $\operatorname{SG}(s_1) \oplus \operatorname{SG}(s_2) \oplus \ldots \oplus \operatorname{SG}(s_n) \neq 0$ 时,这个游戏是先手必胜的。** 这一定理被称作 SG 定理。 diff --git a/docs/math/lagrange-poly.md b/docs/math/lagrange-poly.md index b437e541..bdd7b064 100644 --- a/docs/math/lagrange-poly.md +++ b/docs/math/lagrange-poly.md @@ -19,7 +19,7 @@ ### 方法 2:高斯消元 -使用**待定系数法**。设 $f(x)=\sum_{i=0}^{n-1} a_ix^i$ 将每个 $x_i$ 代入 $f(x)$ ,有 $f(x_i)=y_i$ ,这样就可以得到一个由 $n$ 条 $n$ 元 $1$ 次方程所组成的方程组,然后使用**高斯消元**求出每一项 $a_i$ ,然后将 $k$ 代入求值。 +使用 **待定系数法** 。设 $f(x)=\sum_{i=0}^{n-1} a_ix^i$ 将每个 $x_i$ 代入 $f(x)$ ,有 $f(x_i)=y_i$ ,这样就可以得到一个由 $n$ 条 $n$ 元 $1$ 次方程所组成的方程组,然后使用 **高斯消元** 求出每一项 $a_i$ ,然后将 $k$ 代入求值。 如果您不知道什么是高斯消元,请看[luogu P3389 高斯消元法](https://www.luogu.org/problemnew/show/P3389)。 diff --git a/docs/math/linear-equation.md b/docs/math/linear-equation.md index 9675b321..a02200d9 100644 --- a/docs/math/linear-equation.md +++ b/docs/math/linear-equation.md @@ -1,6 +1,6 @@ ## 介绍 -形如 $ax \equiv b \pmod c$ 的方程被称为**线性同余方程**(Congruence Equation)。 +形如 $ax \equiv b \pmod c$ 的方程被称为 **线性同余方程** (Congruence Equation)。 [\[NOIp 2012\]同余方程](https://www.luogu.org/problemnew/show/P1082) diff --git a/docs/math/misc.md b/docs/math/misc.md index c929b3b2..509c6f6c 100644 --- a/docs/math/misc.md +++ b/docs/math/misc.md @@ -14,29 +14,29 @@ ### 定义及相关概念 -**向量**:既有大小又有方向的量称为向量。 + **向量** :既有大小又有方向的量称为向量。 -**有向线段**:带有方向的线段称为有向线段。有向线段有三要素:**起点,方向,长度**,知道了三要素,终点就唯一确定。我们用有向线段表示向量。 + **有向线段** :带有方向的线段称为有向线段。有向线段有三要素: **起点,方向,长度** ,知道了三要素,终点就唯一确定。我们用有向线段表示向量。 -**向量的模**:有向线段 $\vec{AB}$ 的长度称为向量的模,即为这个向量的大小。记为: $|\vec{AB}|$ 。 + **向量的模** :有向线段 $\vec{AB}$ 的长度称为向量的模,即为这个向量的大小。记为: $|\vec{AB}|$ 。 -**零向量**:模为 $0$ 的向量。零向量的方向任意。记为: $\vec{0}$ 或 $\mathbf{0}$ 。 + **零向量** :模为 $0$ 的向量。零向量的方向任意。记为: $\vec{0}$ 或 $\mathbf{0}$ 。 -**单位向量**:模为 $1$ 的向量称为该方向上的单位向量。 + **单位向量** :模为 $1$ 的向量称为该方向上的单位向量。 -**平行向量**:方向相同或相反的两个**非零**向量。记作: $\vec a\parallel \vec b$ 。 + **平行向量** :方向相同或相反的两个 **非零** 向量。记作: $\vec a\parallel \vec b$ 。 -**相等向量**:模相等且方向相同的向量。 + **相等向量** :模相等且方向相同的向量。 -**相反向量**:模相等且方向相反的向量。 + **相反向量** :模相等且方向相反的向量。 -**向量的夹角**:已知两个非零向量 $\vec a,\vec b$ ,作 $\vec{OA}=\vec a,\vec{OB}=\vec b$ ,那么 $\theta=\angle \text{AOB}$ 就是向量 $\vec a$ 与向量 $\vec b$ 的夹角。记作: $\langle \vec a,\vec b\rangle$ 。显然当 $\theta =0$ 时两向量同向, $\theta=\pi$ 时两向量反向, $\theta=\frac{\pi}{2}$ 时我们说两向量垂直,记作 $\vec a\perp \vec b$ 。并且,我们规定 $\theta \in [0,\pi]$ 。 + **向量的夹角** :已知两个非零向量 $\vec a,\vec b$ ,作 $\vec{OA}=\vec a,\vec{OB}=\vec b$ ,那么 $\theta=\angle \text{AOB}$ 就是向量 $\vec a$ 与向量 $\vec b$ 的夹角。记作: $\langle \vec a,\vec b\rangle$ 。显然当 $\theta =0$ 时两向量同向, $\theta=\pi$ 时两向量反向, $\theta=\frac{\pi}{2}$ 时我们说两向量垂直,记作 $\vec a\perp \vec b$ 。并且,我们规定 $\theta \in [0,\pi]$ 。 (呼……我们一口气把数学书上 2.1.3 之前的定义都给出了。) -我们考虑平行向量,可以任作一条直线与这些向量平行,那么任一组平行向量都可以平移到同一直线上,所以平行向量又叫**共线向量**。 +我们考虑平行向量,可以任作一条直线与这些向量平行,那么任一组平行向量都可以平移到同一直线上,所以平行向量又叫 **共线向量** 。 -由于数学上研究的向量为**自由向量**,即只要不改变它的大小和方向,起点和终点可以任意平行移动的向量。 +由于数学上研究的向量为 **自由向量** ,即只要不改变它的大小和方向,起点和终点可以任意平行移动的向量。 注意到平面向量具有方向性,我们并不能比较两个向量的大小。但是两个向量可以相等。 @@ -52,16 +52,16 @@ 所以我们整理一下向量的加法法则: -1. **向量加法的三角形法则**:若要求和的向量首尾顺次相连,那么这些向量的和为第一个向量的起点指向最后一个向量的终点; -2. **向量加法的平行四边形法则**:若要求和的两个向量**共起点**,那么它们的和向量为以这两个向量为邻边的平行四边形的对角线,起点为两个向量共有的起点,方向沿平行四边形对角线方向。 +1. **向量加法的三角形法则** :若要求和的向量首尾顺次相连,那么这些向量的和为第一个向量的起点指向最后一个向量的终点; +2. **向量加法的平行四边形法则** :若要求和的两个向量 **共起点** ,那么它们的和向量为以这两个向量为邻边的平行四边形的对角线,起点为两个向量共有的起点,方向沿平行四边形对角线方向。 这样,向量的加法就具有了几何意义。 -并且可以验证,向量的加法满足**交换律与结合律**。 +并且可以验证,向量的加法满足 **交换律与结合律** 。 因为实数的减法可以写成加上相反数的形式,我们考虑在向量做减法时也这么写。即: $\vec a-\vec b=\vec a+(-\vec b)$ 。 -这样,我们考虑共起点的向量,按照平行四边形法则做出它们的差,经过平移后可以发现**共起点向量的差向量是由减向量指向被减向量的有向线段**。 +这样,我们考虑共起点的向量,按照平行四边形法则做出它们的差,经过平移后可以发现 **共起点向量的差向量是由减向量指向被减向量的有向线段** 。 这也是向量减法的几何意义。 @@ -73,7 +73,7 @@ 同样的, $\vec c=-\vec a-\vec a-\vec a$ ,那么 $\vec c=3(-\vec a)=-3\vec a$ 。 -于是,一般地,我们规定实数 $\lambda$ 与向量 $\vec a$ 的积为一个向量,这种运算就是向量的**数乘运算**,记作 $\lambda \vec a$ ,它的长度与方向规定如下: +于是,一般地,我们规定实数 $\lambda$ 与向量 $\vec a$ 的积为一个向量,这种运算就是向量的 **数乘运算** ,记作 $\lambda \vec a$ ,它的长度与方向规定如下: 1. $|\lambda \vec a|=|\lambda||\vec a|$ ; 2. 当 $\lambda >0$ 时, $\lambda\vec a$ 与 $\vec a$ 同向,当 $\lambda =0$ 时, $\lambda \vec a=\vec 0$ ,当 $\lambda<0$ 时, $\lambda \vec a$ 与 $\vec a$ 方向相反。 @@ -93,11 +93,11 @@ $$ \lambda(\vec a-\vec b)=\lambda \vec a-\lambda \vec b $$ -由数乘的定义可知,对于**非零**向量 $\vec a$ ,如果存在实数 $\lambda$ ,使得 $\vec b=\lambda \vec a$ ,那么 $\vec a \parallel \vec b$ 。 +由数乘的定义可知,对于 **非零** 向量 $\vec a$ ,如果存在实数 $\lambda$ ,使得 $\vec b=\lambda \vec a$ ,那么 $\vec a \parallel \vec b$ 。 反过来,如果 $\vec a\parallel \vec b$ , $\vec a \not = \vec 0$ ,且 $|\vec b|=\mu |\vec a|$ ,那么当 $\vec a$ 与 $\vec b$ 同向时, $\vec b=\mu \vec a$ ,反向时 $\vec b=-\mu \vec a$ 。 -综上,我们有如下定理:**非零**向量 $\vec a$ 与 $\vec b$ 共线,当且仅当有唯一实数 $\lambda$ ,使得 $\vec b=\lambda \vec a$ 。 +综上,我们有如下定理: **非零** 向量 $\vec a$ 与 $\vec b$ 共线,当且仅当有唯一实数 $\lambda$ ,使得 $\vec b=\lambda \vec a$ 。 最后,向量的加,减,数乘统称为向量的线性运算。 @@ -109,11 +109,11 @@ $$ 我们先用一个向量表示出所有向量,这显然是不可能的,因为根据 1.2.2 中的定理,这样我们只能表示出某条直线上的向量。 -我们再加入一个向量,用两个**不共线**向量表示(两个共线向量在此可以看成同一个向量),这样我们可以把任意一个平面向量分解到这两个向量的方向上了。 +我们再加入一个向量,用两个 **不共线** 向量表示(两个共线向量在此可以看成同一个向量),这样我们可以把任意一个平面向量分解到这两个向量的方向上了。 -也就是说,如果两个向量 $\vec{e_1},\vec{e_2}$ 不共线,那么存在唯一实数对 $(x,y)$ ,使得与 $\vec{e_1},\vec{e_2}$ 共面的任意向量 $\vec p$ 满足 $\vec p=x\vec{e_1}+y\vec{e_2}$ ,这就是**平面向量基本定理**。在同一平面内的两个不共线的向量称为**基底**。 +也就是说,如果两个向量 $\vec{e_1},\vec{e_2}$ 不共线,那么存在唯一实数对 $(x,y)$ ,使得与 $\vec{e_1},\vec{e_2}$ 共面的任意向量 $\vec p$ 满足 $\vec p=x\vec{e_1}+y\vec{e_2}$ ,这就是 **平面向量基本定理** 。在同一平面内的两个不共线的向量称为 **基底** 。 -如果基底相互垂直,那么我们在分解的时候就是对向量**正交分解**。 +如果基底相互垂直,那么我们在分解的时候就是对向量 **正交分解** 。 #### 平面向量的坐标表示 @@ -121,7 +121,7 @@ $$ 我们可以取与 $x$ 轴与 $y$ 轴方向相同的单位向量 $i,j$ 作为一组基底,可以发现, $\vec p=x\vec i+y\vec j$ ,其中 $\vec p$ 为平面内任意向量。 -由于平面向量基本定理,我们发现这样的实数对 $(x,y)$ 是唯一的。这样,平面内的任意向量都可以用有序实数对唯一确定,我们把 $(x,y)$ 叫做向量的**坐标**。记作: $\vec p=(x,y)$ 。 +由于平面向量基本定理,我们发现这样的实数对 $(x,y)$ 是唯一的。这样,平面内的任意向量都可以用有序实数对唯一确定,我们把 $(x,y)$ 叫做向量的 **坐标** 。记作: $\vec p=(x,y)$ 。 这样没问题?是的,因为有序实数对 $(x,y)$ 与平面直角坐标系上的点唯一确定,那么我们作 $\vec{OP}=\vec p$ ,那么终点 $P(x,y)$ 也是唯一确定的。由于我们研究的都是自由向量,可以自由平移起点,这样,在平面直角坐标系里,每一个向量都可以用有序实数对唯一表示。 @@ -198,11 +198,11 @@ $$ 向量积也叫外积。 -由于向量积涉及到空间几何与线性代数知识,所以并未在高中课本中出现。然而注意到向量积的模,联想到三角形面积计算公式 $S=\frac{1}{2}ab\sin C$ ,我们可以发现向量积的几何意义是:** $|\vec a\times \vec b|$ 是以 $\vec a,\vec b$ 为邻边的平行四边形的面积**。 +由于向量积涉及到空间几何与线性代数知识,所以并未在高中课本中出现。然而注意到向量积的模,联想到三角形面积计算公式 $S=\frac{1}{2}ab\sin C$ ,我们可以发现向量积的几何意义是: ** $|\vec a\times \vec b|$ 是以 $\vec a,\vec b$ 为邻边的平行四边形的面积** 。 知道这个,多边形面积就很好算了。 -我们有一个不完全的坐标表示:记 $\vec a=(m,n),\vec b=(p,q)$ ,那么两个向量的向量积的竖坐标为 $mq-np$ ,我们根据右手法则和竖坐标符号可以推断出 $\vec b$ 相对于 $\vec a$ 的方向,若在逆时针方向竖坐标为正值,反之为负值,简记为**顺负逆正**。 +我们有一个不完全的坐标表示:记 $\vec a=(m,n),\vec b=(p,q)$ ,那么两个向量的向量积的竖坐标为 $mq-np$ ,我们根据右手法则和竖坐标符号可以推断出 $\vec b$ 相对于 $\vec a$ 的方向,若在逆时针方向竖坐标为正值,反之为负值,简记为 **顺负逆正** 。 ## 极坐标与极坐标系 @@ -214,15 +214,15 @@ $$ 首先我们用旋转的思路定义角,角可以看成平面内一条射线绕其端点从一个位置旋转到另一个位置形成的图形。开始的位置称为始边,结束的位置称为终边。 -我们规定,按**逆时针**方向旋转形成的角叫做**正角**,按**顺时针**方向旋转所形成的角叫做**负角**,如果这条射线没有做任何旋转,称为**零角**。这样我们就把角的概念推向了**任意角**。 +我们规定,按 **逆时针** 方向旋转形成的角叫做 **正角** ,按 **顺时针** 方向旋转所形成的角叫做 **负角** ,如果这条射线没有做任何旋转,称为 **零角** 。这样我们就把角的概念推向了 **任意角** 。 -然后我们介绍**弧度制**,把长度等于半径长的弧所对的圆心角称为 $1$ 弧度的角,用符号 $\text{rad}$ 表示,读作:弧度。 +然后我们介绍 **弧度制** ,把长度等于半径长的弧所对的圆心角称为 $1$ 弧度的角,用符号 $\text{rad}$ 表示,读作:弧度。 一般地,正角的弧度数为正,负角的弧度数为负,零角的弧度数为 $0$ ,如果半径为 $r$ 的圆的圆心角 $\alpha$ 所对弧长为 $l$ ,则 $|\alpha|=\frac{l}{r}$ 。利用这个公式还可以写出弧长和扇形面积公式,在此略过。 那么,我们发现 $360^\circ$ 的角弧度数为 $2\pi$ ,这样有了对应关系之后,我们可以进行角度值和弧度制的转化了。 -我们考虑一个角,将其终边再旋转一周,甚至多周,始边位置不动,那么终边位置永远是相同的,我们称这些角为**终边位置相同的角**。 +我们考虑一个角,将其终边再旋转一周,甚至多周,始边位置不动,那么终边位置永远是相同的,我们称这些角为 **终边位置相同的角** 。 与角 $\alpha$ 终边位置相同的角的集合很容易得出,为 $\{\theta\mid \theta=\alpha+2k\pi,k\in \mathbb{Z}\}$ 。 @@ -236,11 +236,11 @@ $$ 我们考虑实际情况,比如航海,我们说「 $B$ 在 $A$ 的北偏东 $30^\circ$ 方向上,距离为 $100$ 米」,而不是「以 $A$ 为原点建立平面直角坐标系, $B(50,50\sqrt 3)$ 」。 -这样,我们在平面上选一定点 $O$ ,称为**极点**,自极点引出一条射线 $Ox$ ,称为**极轴**,再选择一个单位长度(在数学问题中通常为 $1$ ),一个角度单位(通常为弧度)及其正方向(通常为逆时针方向),这样就建立了**极坐标系**。 +这样,我们在平面上选一定点 $O$ ,称为 **极点** ,自极点引出一条射线 $Ox$ ,称为 **极轴** ,再选择一个单位长度(在数学问题中通常为 $1$ ),一个角度单位(通常为弧度)及其正方向(通常为逆时针方向),这样就建立了 **极坐标系** 。 在极坐标系下,我们怎么描述位置呢? -设 $A$ 为平面上一点,极点 $O$ 与 $A$ 之间的距离 $|OA|$ 即为**极径**,记为 $\rho$ ;以极轴为始边, $OA$ 为终边的角 $\angle xOA$ 为**极角**,记为 $\theta$ ,那么有序数对 $(\rho,\theta)$ 即为 $A$ 的**极坐标**。 +设 $A$ 为平面上一点,极点 $O$ 与 $A$ 之间的距离 $|OA|$ 即为 **极径** ,记为 $\rho$ ;以极轴为始边, $OA$ 为终边的角 $\angle xOA$ 为 **极角** ,记为 $\theta$ ,那么有序数对 $(\rho,\theta)$ 即为 $A$ 的 **极坐标** 。 由终边相同的角的定义可知, $(\rho,\theta)$ 与 $(\rho,\theta+2k\pi)\ (k\in \mathbb{Z})$ 其实表示的是一样的点,特别地,极点的极坐标为 $(0,\theta)\ (\theta\in \mathbb{R})$ ,于是平面内的点的极坐标表示有无数多种。 diff --git a/docs/math/mobius.md b/docs/math/mobius.md index 949b032f..89d04a7c 100644 --- a/docs/math/mobius.md +++ b/docs/math/mobius.md @@ -2,7 +2,7 @@ 莫比乌斯反演是数论中的重要内容。对于一些函数 $f(n)$ ,如果很难直接求出它的值,而容易求出其倍数和或约数和 $g(n)$ ,那么可以通过莫比乌斯反演简化运算,求得 $f(n)$ 的值。 -开始学习莫比乌斯反演前,我们需要一些前置知识:**积性函数**、**Dirichlet 卷积**、**莫比乌斯函数**。 +开始学习莫比乌斯反演前,我们需要一些前置知识: **积性函数** 、 **Dirichlet 卷积** 、 **莫比乌斯函数** 。 * * * @@ -114,15 +114,15 @@ $$ 反演结论: $\displaystyle [gcd(i,j)=1] \Leftrightarrow\sum_{d\mid\gcd(i,j)}\mu(d)$ -- **直接推导**:如果看懂了上一个结论,这个结论稍加思考便可以推出:如果 $\gcd(i,j)=1$ 的话,那么代表着我们按上个结论中枚举的那个 $n$ 是 $1$ ,也就是式子的值是 $1$ ,反之,有一个与 $[\gcd(i,j)=1]$ 相同的值: $0$ +- **直接推导** :如果看懂了上一个结论,这个结论稍加思考便可以推出:如果 $\gcd(i,j)=1$ 的话,那么代表着我们按上个结论中枚举的那个 $n$ 是 $1$ ,也就是式子的值是 $1$ ,反之,有一个与 $[\gcd(i,j)=1]$ 相同的值: $0$ -- **利用 $\varepsilon$ 函数**:根据上一结论, $[\gcd(i,j)=1]\Rightarrow \varepsilon(\gcd(i,j))$ ,将 $\varepsilon$ 展开即可。 +- **利用 $\varepsilon$ 函数** :根据上一结论, $[\gcd(i,j)=1]\Rightarrow \varepsilon(\gcd(i,j))$ ,将 $\varepsilon$ 展开即可。 ### 线性筛 由于 $\mu$ 函数为积性函数,因此可以线性筛莫比乌斯函数(线性筛基本可以求所有的积性函数,尽管方法不尽相同)。 -**代码**: + **代码** : ```cpp void getMu() { @@ -191,7 +191,7 @@ $$ ### 证明 -- **暴力计算**: +- **暴力计算** : $$ \sum_{d\mid n}\mu(d)f(\frac{n}{d})=\sum_{d\mid n}\mu(d)\sum_{k\mid \frac{n}{d}}g(k)=\sum_{k\mid n}g(k)\sum_{d\mid \frac{n}{k}}\mu(d)=g(n) @@ -199,7 +199,7 @@ $$ 用 $\displaystyle\sum_{d\mid n}g(d)$ 来替换 $f(\dfrac{n}{d})$ ,再变换求和顺序。最后一步转为的依据: $\displaystyle\sum_{d\mid n}\mu(d)=[n=1]$ ,因此在 $\dfrac{n}{k}=1$ 时第二个和式的值才为 $1$ 。此时 $n=k$ ,故原式等价于 $\displaystyle\sum_{k\mid n}[n=k]\cdot g(k)=g(n)$ -- **运用卷积**: +- **运用卷积** : 原问题为:已知 $f=g*1$ ,证明 $g=f*\mu$ @@ -256,9 +256,9 @@ $$ 很显然,式子可以数论分块求解(注意:过程中默认 $n\leqslant m$ )。 -**时间复杂度**: $\Theta(N+T\sqrt{n})$ + **时间复杂度** : $\Theta(N+T\sqrt{n})$ -**代码**: + **代码** : ```cpp #include @@ -348,9 +348,9 @@ $$ 设 $\displaystyle \text{g}(n)=\sum_{d\mid n} d\cdot\varphi(d)$ ,已知 $\text{g}$ 为积性函数,于是可以 $\Theta(n)$ 预处理。最后枚举 $d$ ,统计贡献即可。 -**时间复杂度**: $\Theta(n\log n)$ + **时间复杂度** : $\Theta(n\log n)$ -**代码**: + **代码** : ```cpp #include @@ -460,9 +460,9 @@ $$ 本题除了推式子比较复杂、代码细节较多之外,是一道很好的莫比乌斯反演练习题!(上述过程中,默认 $n\leqslant m$ ) -**时间复杂度**: $\Theta(n+m)$ (两次数论分块) + **时间复杂度** : $\Theta(n+m)$ (两次数论分块) -**代码**: + **代码** : ```cpp #include diff --git a/docs/math/sieve.md b/docs/math/sieve.md index d7438f68..057aaaf6 100644 --- a/docs/math/sieve.md +++ b/docs/math/sieve.md @@ -24,7 +24,7 @@ int Eratosthenes(int n) { } ``` -以上为**Eratosthenes 筛法**(埃拉托斯特尼筛法),时间复杂度是 $O(n\log\log n)$ 。 +以上为 **Eratosthenes 筛法** (埃拉托斯特尼筛法),时间复杂度是 $O(n\log\log n)$ 。 以上做法仍有优化空间,我们发现这里面似乎会对某些数标记了很多次其为合数。有没有什么办法省掉无意义的步骤呢? @@ -61,7 +61,7 @@ void init() { 上面代码中的 $phi$ 数组,会在下面提到。 -上面的这种**线性筛法**也称为**Euler 筛法**(欧拉筛法)。 +上面的这种 **线性筛法** 也称为 **Euler 筛法** (欧拉筛法)。 ??? note 注意到筛法求素数的同时也得到了每个数的最小质因子 diff --git a/docs/misc/cdq-divide.md b/docs/misc/cdq-divide.md index c8ba447b..9a882ab1 100644 --- a/docs/misc/cdq-divide.md +++ b/docs/misc/cdq-divide.md @@ -4,11 +4,11 @@ 现在 oi 界对于 cdq 分治这个思想的拓展十分广泛,但是这些都叫 cdq 的东西其实原理和写法上并不相同不过我们可以大概的将它们分为三类 -**1.cdq 分治解决和点对有关的问题** + **1.cdq 分治解决和点对有关的问题** -**2.cdq 分治优化 1D/1D 动态规划的转移** + **2.cdq 分治优化 1D/1D 动态规划的转移** -**3. 通过 cdq 分治,将一些动态问题转化为静态问题** + **3. 通过 cdq 分治,将一些动态问题转化为静态问题** * * * @@ -18,21 +18,21 @@ 那么 cdq 分治基于这样一个算法流程解决这类问题 -**1. 找到这个序列的中点 $mid$ ** + **1. 找到这个序列的中点 $mid$ ** -**2. 将所有点对 $(i,j)$ 划分为 3 类** + **2. 将所有点对 $(i,j)$ 划分为 3 类** -**第一种是 $1 \leq i \leq mid,1 \leq j \leq mid$ 的点对** + **第一种是 $1 \leq i \leq mid,1 \leq j \leq mid$ 的点对** -**第二种是 $1 \leq i \leq mid ,mid+1 \leq j \leq n$ 的点对** + **第二种是 $1 \leq i \leq mid ,mid+1 \leq j \leq n$ 的点对** -**第三种是 $mid+1 \leq i \leq n,mid+1 \leq j \leq n$ 的点对** + **第三种是 $mid+1 \leq i \leq n,mid+1 \leq j \leq n$ 的点对** -**3. 将 $(1,n)$ 这个序列拆成两个序列 $(1,mid)$ 和 $(mid+1,n)$ ** + **3. 将 $(1,n)$ 这个序列拆成两个序列 $(1,mid)$ 和 $(mid+1,n)$ ** -**会发现第一类点对和第三类点对都在这两个序列之中,递归的去解决这两类点对** + **会发现第一类点对和第三类点对都在这两个序列之中,递归的去解决这两类点对** -**4. 想方设法处理一下第二类点对的信息** + **4. 想方设法处理一下第二类点对的信息** _实际应用的时候我们通常都是写一个函数 $solve(l,r)$ 表示我们正在处理 $l \leq i \leq r,l \leq j \leq r$ 的点对_ @@ -214,13 +214,13 @@ _如果你足够熟练的话可以看出这就是一个二维最长上升子序 具体来讲我们这样写 cdq, 假设我们现在正在处理的区间是 $(l,r)$ , -**0. 如果 $l=r$ 说明我们的 $dp_{r}$ 值已经被计算好了,我们直接令 $dp_{r}++$ 然后返回即可** + **0. 如果 $l=r$ 说明我们的 $dp_{r}$ 值已经被计算好了,我们直接令 $dp_{r}++$ 然后返回即可** -**1. 先递归的 $solve(l,mid)$ ** + **1. 先递归的 $solve(l,mid)$ ** -**2. 处理所有 $l \leq j \leq mid,mid+1 \leq i \leq r$ 的转移关系** + **2. 处理所有 $l \leq j \leq mid,mid+1 \leq i \leq r$ 的转移关系** -**3. 然后递归的 $solve(mid+1,r)$ ** + **3. 然后递归的 $solve(mid+1,r)$ ** 那么第二步怎么做呢? @@ -228,11 +228,11 @@ _如果你足够熟练的话可以看出这就是一个二维最长上升子序 你会发现此时的 cdq 写法和上一种处理点对间关系的 cdq 写法最大的不同就是处理 $l \leq j \leq mid,mid+1 \leq i \leq r$ 的点对这一部分,上面的写法中这一部分我们放到哪里都是可以的,但是,在用 cdq 分治优化 dp 的时候这个流程却必须夹在 $solve(l,mid),solve(mid+1,r)$ 的中间,为什么呢? -因为 dp 的转移是**有序的**,我们的 dp 的转移必须满足两个条件否则就是不对的 +因为 dp 的转移是 **有序的** ,我们的 dp 的转移必须满足两个条件否则就是不对的 -**1. 用来计算 $dp_{i}$ 的所有 $dp_{j}$ 值都必须是已经计算完毕的,不能存在 "半成品"** + **1. 用来计算 $dp_{i}$ 的所有 $dp_{j}$ 值都必须是已经计算完毕的,不能存在 "半成品"** -**2. 用来计算 $dp_{i}$ 的所有 $dp_{j}$ 值都必须能更新到 $dp_{i}$ 不能存在有的 $dp_{j}$ 值没有更新到** + **2. 用来计算 $dp_{i}$ 的所有 $dp_{j}$ 值都必须能更新到 $dp_{i}$ 不能存在有的 $dp_{j}$ 值没有更新到** 上述两个条件可能在 $O(n^2)$ 暴力的时候是相当容易满足的,但是由于我们现在使用了 cdq 分治,很显然转移顺序被我们搞的乱七八糟了,所以我们有必要好好考虑一下我们这样做到底是不是对的 @@ -276,7 +276,7 @@ _如果你足够熟练的话可以看出这就是一个二维最长上升子序 通过我们刚才手玩了半个函数流程我们会发现一个令人惊讶的事实就是每次 $solve(l,r)$ 结束的时候 $(l,r)$ 区间的 dp 值全部会被计算好,由于我们每一次执行转移函数的时候由于 $solve(l,mid)$ 已经结束,因此我们每一次执行的转移过程都是合法的 -在刚才的过程我们发现,如果将 cdq 分治的递归树看成一颗线段树,那么 cdq 分治就是这个线段树的**中序遍历函数**,因此我们相当于按顺序处理了所有的 dp 值,只是转移顺序被拆开了而已,所以我们的算法是正确的 +在刚才的过程我们发现,如果将 cdq 分治的递归树看成一颗线段树,那么 cdq 分治就是这个线段树的 **中序遍历函数** ,因此我们相当于按顺序处理了所有的 dp 值,只是转移顺序被拆开了而已,所以我们的算法是正确的 * * * @@ -362,7 +362,7 @@ int main() 接下来我们处理所有 $l \leq i \leq mid,mid+1 \leq j \leq r$ 并且 $i$ 是一个修改并且 $j$ 是一个询问的修改 - 询问关系 -注意如果我们的各个修改之间是**独立**的话我们不需要管处理 $l \leq i \leq mid,mid+1 \leq j \leq r$ 和 $solve(l,mid)$ 以及 $solve(mid+1,r)$ 之间时序关系(比如你的修改就是普通的加法和减法问题之类的) +注意如果我们的各个修改之间是 **独立** 的话我们不需要管处理 $l \leq i \leq mid,mid+1 \leq j \leq r$ 和 $solve(l,mid)$ 以及 $solve(mid+1,r)$ 之间时序关系(比如你的修改就是普通的加法和减法问题之类的) 但是如果你的各个修改之间并不独立,比如说我们的修改是一个赋值操作,这样的话我们做完这个赋值操作之后序列长什么样可能需要依赖于之前的序列长什么样 @@ -402,7 +402,7 @@ int main() 那么我们可以将动态问题转化为静态问题的精髓就在于 cdq 分治每次仅仅处理跨越某一个点的修改和询问关系了,这样的话我们就只需要考虑所有询问都在修改之后这个简单的问题了。 -也正是因为这一点 cdq 分治被称为**动态问题转化为静态问题的工具** +也正是因为这一点 cdq 分治被称为 **动态问题转化为静态问题的工具** ### [Ynoi2016]镜中的昆虫 diff --git a/docs/misc/complexity.md b/docs/misc/complexity.md index 7b00ed27..d791ca87 100644 --- a/docs/misc/complexity.md +++ b/docs/misc/complexity.md @@ -62,7 +62,7 @@ $$ 例如快速排序中的“按大小分类”操作,单次执行的最坏时间复杂度,看似是 $O(n)$ 的。 但是由于快排的分治过程,先前的“分类”操作每次都减小了数组长度,所以实际的总复杂度 $O(n \log_2 n)$ ,分摊在每一次“分类”操作上,是 $O(\log_2 n)$ 。 -多次操作的总复杂度除以操作次数,就是这种操作的**均摊复杂度**。 +多次操作的总复杂度除以操作次数,就是这种操作的 **均摊复杂度** 。 ## 势能分析 diff --git a/docs/misc/dsu-on-tree.md b/docs/misc/dsu-on-tree.md index 8bcca73e..4385bf41 100644 --- a/docs/misc/dsu-on-tree.md +++ b/docs/misc/dsu-on-tree.md @@ -51,9 +51,9 @@ void merge(int x, int y) { 遍历一个节点,我们按以下的步骤进行遍历: -- 先遍历其非重儿子,获取它的 ans,但**不保留遍历后它的 check**; +- 先遍历其非重儿子,获取它的 ans,但 **不保留遍历后它的 check** ; -- 遍历它的重儿子,**保留它的 check**; +- 遍历它的重儿子, **保留它的 check** ; - 再次遍历其非重儿子及其父亲,用重儿子的 check 对遍历到的节点进行计算,获取整棵子树的 ans; @@ -139,7 +139,7 @@ int dfs2(int u, int fa, bool keep, bool isson) { 如[CF741D](http://codeforces.com/problemset/problem/741/D)。给一棵树,每个节点的权值是'a'到'v'的字母,每次询问要求在一个子树找一条路径,使该路径包含的字符排序后成为回文串。 -因为是排列后成为回文串,所以一个字符出现了两次相当于没出现,也就是说,这条路径满足**最多有一个字符出现奇数次**。 +因为是排列后成为回文串,所以一个字符出现了两次相当于没出现,也就是说,这条路径满足 **最多有一个字符出现奇数次** 。 正常做法是对每一个节点 dfs,每到一个节点就强行枚举所有字母找到和他异或后结果为 1 的个数<1 的路径,再去最长值,这样 $O(n^2\log n)$ 的,可以用 dsu on tree 优化到 $O(n\log^2n)$ 。关于具体做法,可以参考下面的扩展阅读 diff --git a/docs/misc/endianness.md b/docs/misc/endianness.md index 34e219ed..32db4823 100644 --- a/docs/misc/endianness.md +++ b/docs/misc/endianness.md @@ -12,7 +12,7 @@ ## 小端序 -小端序是指机器选择在内存中按照从**最低**有效字节到**最高**有效字节的顺序存储对象。 +小端序是指机器选择在内存中按照从 **最低** 有效字节到 **最高** 有效字节的顺序存储对象。 上文提到的变量就表示如下: @@ -22,7 +22,7 @@ ## 大端序 -大端序是指机器选择在内存中按照从**最高**有效字节到**最低**有效字节的顺序存储对象。 +大端序是指机器选择在内存中按照从 **最高** 有效字节到 **最低** 有效字节的顺序存储对象。 上文提到的变量就表示如下: diff --git a/docs/misc/fractional-programming.md b/docs/misc/fractional-programming.md index 34f7ad98..29e26b44 100644 --- a/docs/misc/fractional-programming.md +++ b/docs/misc/fractional-programming.md @@ -20,7 +20,7 @@ f(i,j)=\left\{ . $$ -如果**合并方式得当**,则可以在 $O(n^2)$ 的时间复杂度内完成状态转移,具体细节参见代码。 +如果 **合并方式得当** ,则可以在 $O(n^2)$ 的时间复杂度内完成状态转移,具体细节参见代码。 但是,我们是让一个分式的值最大化,然而这个分式的分母又不确定,怎么办呢? diff --git a/docs/misc/hill-climbing.md b/docs/misc/hill-climbing.md index dea8af96..4f8ea850 100644 --- a/docs/misc/hill-climbing.md +++ b/docs/misc/hill-climbing.md @@ -60,4 +60,4 @@ int main() { ## 劣势 -其实爬山算法的劣势上文已经提及:它容易陷入一个局部最优解。当目标函数不是单峰函数时,这个劣势是致命的。因此我们要引进[**模拟退火**](/misc/simulated-annealing/)。 +其实爬山算法的劣势上文已经提及:它容易陷入一个局部最优解。当目标函数不是单峰函数时,这个劣势是致命的。因此我们要引进[ **模拟退火** ](/misc/simulated-annealing/)。 diff --git a/docs/misc/io.md b/docs/misc/io.md index a792b5ef..54616f17 100644 --- a/docs/misc/io.md +++ b/docs/misc/io.md @@ -40,7 +40,7 @@ std::cin.tie(0); 10 进制整数中是不含空格或除 0~9 和正负号外的其他字符的,因此在读入不应存在于整数中的字符(通常为空格)时,就可以判定已经读入结束 -C 和 C++ 语言分别在 ctype.h 和 cctype 头文件中,提供了函数 `isdigit` , 这个函数会检查传入的参数是否为十进制数字字符,是则返回**true**,否则返回**false**。对应的,在下面的代码中,可以使用 `isdigit(ch)` 代替 `ch >= '0' && ch <= '9'` ,而可以使用 `!isdigit(ch)` 代替 `ch <'0' || ch> '9'` +C 和 C++ 语言分别在 ctype.h 和 cctype 头文件中,提供了函数 `isdigit` , 这个函数会检查传入的参数是否为十进制数字字符,是则返回 **true** ,否则返回 **false** 。对应的,在下面的代码中,可以使用 `isdigit(ch)` 代替 `ch >= '0' && ch <= '9'` ,而可以使用 `!isdigit(ch)` 代替 `ch <'0' || ch> '9'` ### 代码实现 diff --git a/docs/misc/magic.md b/docs/misc/magic.md index d2b1c290..1e40dd53 100644 --- a/docs/misc/magic.md +++ b/docs/misc/magic.md @@ -29,7 +29,7 @@ Shadowsocks 是一个安全的 `socks5` 代理,支持多种平台。 ### 为什么不推荐使用 ssr? -ssr 在开发过程中违反了[GPL 协议](https://zh.wikipedia.org/wiki/GNU%E9%80%9A%E7%94%A8%E5%85%AC%E5%85%B1%E8%AE%B8%E5%8F%AF%E8%AF%81),GPL 要求再分发时应开放源代码,而 ssr 的维护者并没有做到这一点。作为一个合格的 OIer,**遵守开源协议**是最起码的要求,所以这里并不提倡使用 ssr。 +ssr 在开发过程中违反了[GPL 协议](https://zh.wikipedia.org/wiki/GNU%E9%80%9A%E7%94%A8%E5%85%AC%E5%85%B1%E8%AE%B8%E5%8F%AF%E8%AF%81),GPL 要求再分发时应开放源代码,而 ssr 的维护者并没有做到这一点。作为一个合格的 OIer, **遵守开源协议** 是最起码的要求,所以这里并不提倡使用 ssr。 引用 clowwindy 的一段著名的[评论](https://github.com/shadowsocks/shadowsocks-windows/issues/293#issuecomment-132253168)作为结语。 diff --git a/docs/misc/matrix-tree.md b/docs/misc/matrix-tree.md index c135ff24..91a11f2a 100644 --- a/docs/misc/matrix-tree.md +++ b/docs/misc/matrix-tree.md @@ -2,7 +2,7 @@ Kirchhoff 矩阵树定理(简称矩阵树定理)解决了一张图的生成 ## 本篇记号声明 -**本篇中的图,无论无向还是有向,都允许重边,但是不允许自环。** + **本篇中的图,无论无向还是有向,都允许重边,但是不允许自环。** ### 无向图情况 @@ -58,7 +58,7 @@ $$ 矩阵树定理具有多种形式。其中用得较多的是定理 1、定理 3 与定理 4。 -**定理 1(矩阵树定理,无向图行列式形式)**对于任意的 $i$ ,都有 + **定理 1(矩阵树定理,无向图行列式形式)** 对于任意的 $i$ ,都有 $$ t(G) = \det L(G)\binom{1,2,\cdots,i-1,i+1,\cdots,n}{1,2,\cdots,i-1,i+1,\cdots,n} @@ -66,11 +66,11 @@ $$ 其中记号 $L(G)\binom{1,2,\cdots,i-1,i+1,\cdots,n}{1,2,\cdots,i-1,i+1,\cdots,n}$ 表示矩阵 $L(G)$ 的第 $1,\cdots,i-1,i+1,\cdots,n$ 行与第 $1,\cdots,i-1,i+1,\cdots,n$ 列构成的子矩阵。也就是说,无向图的 Laplace 矩阵具有这样的性质,它的所有 $n-1$ 阶主子式都相等。 -**定理 2(矩阵树定理,无向图特征值形式)**设 $\lambda_1, \lambda_2, \cdots, \lambda_{n-1}$ 为 $L(G)$ 的 $n - 1$ 个非零特征值,那么有 + **定理 2(矩阵树定理,无向图特征值形式)** 设 $\lambda_1, \lambda_2, \cdots, \lambda_{n-1}$ 为 $L(G)$ 的 $n - 1$ 个非零特征值,那么有 $t(G) = \frac{1}{n}\lambda_1\lambda_2\cdots\lambda_{n-1}$ -**定理 3(矩阵树定理,有向图根向形式)**对于任意的 $k$ ,都有 + **定理 3(矩阵树定理,有向图根向形式)** 对于任意的 $k$ ,都有 $$ t^{root}(G,k) = \det L^{out}(G)\binom{1,2,\cdots,k-1,k+1,\cdots,n}{1,2,\cdots,k-1,k+1,\cdots,n} @@ -78,7 +78,7 @@ $$ 因此如果要统计一张图所有的根向树形图,只要枚举所有的根 $k$ 并对 $t^{root}(G,k)$ 求和即可。 -**定理 4(矩阵树定理,有向图叶向形式)**对于任意的 $k$ ,都有 + **定理 4(矩阵树定理,有向图叶向形式)** 对于任意的 $k$ ,都有 $$ t^{leaf}(G,k) = \det L^{in}(G)\binom{1,2,\cdots,k-1,k+1,\cdots,n}{1,2,\cdots,k-1,k+1,\cdots,n} @@ -88,7 +88,7 @@ $$ ## BEST 定理 -**定理 5 (BEST 定理)**设 $G$ 是有向欧拉图,那么 $G$ 的不同欧拉回路总数 $ec(G)$ 是 + **定理 5 (BEST 定理)** 设 $G$ 是有向欧拉图,那么 $G$ 的不同欧拉回路总数 $ec(G)$ 是 $$ ec(G) = t^{root}(G,k)\prod_{v\in V}(\deg (v) - 1)! @@ -101,12 +101,12 @@ $$ ???+ note "例题 1" HEOI2015: 小 Z 的房间,请参考 -**解**矩阵树定理的裸题。将每个空房间看作一个结点,根据输入的信息建图,得到 Laplace 矩阵后,任意删掉 L 的第 $i$ 行第 $i$ 列,求这个子式的行列式即可。求行列式的方法就是高斯消元成上三角阵然后算对角线积。另外本题需要在模 $k$ 的整数子环 $\mathbb{Z}_k$ 上进行高斯消元,采用辗转相除法即可。 + **解** 矩阵树定理的裸题。将每个空房间看作一个结点,根据输入的信息建图,得到 Laplace 矩阵后,任意删掉 L 的第 $i$ 行第 $i$ 列,求这个子式的行列式即可。求行列式的方法就是高斯消元成上三角阵然后算对角线积。另外本题需要在模 $k$ 的整数子环 $\mathbb{Z}_k$ 上进行高斯消元,采用辗转相除法即可。 ???+ note "例题 2" FJOI2007: 轮状病毒。请参考 -**解**本题的解法很多,这里用矩阵树定理是最直接的解法。当输入为 $n$ 时,容易写出其 $n+1$ 阶的 Laplace 矩阵为: + **解** 本题的解法很多,这里用矩阵树定理是最直接的解法。当输入为 $n$ 时,容易写出其 $n+1$ 阶的 Laplace 矩阵为: $$ L_n = \begin{bmatrix} @@ -125,7 +125,7 @@ $$ ???+ note "例题 2+" 将例题 2 的数据加强,要求 $n\leq 100000$ ,但是答案对 1000007 取模。(本题求解需要一些线性代数知识) -**解**推导递推式后利用矩阵快速幂即可求得。 + **解** 推导递推式后利用矩阵快速幂即可求得。 ??? danger "推导递推式的过程。警告:过程冗杂" @@ -181,7 +181,7 @@ $$ ???+ note "例题 3" BZOJ3659: WHICH DREAMED IT -**解**本题是 BEST 定理的直接应用,但是要注意,由于题目规定“两种完成任务的方式算作不同当且仅当使用钥匙的顺序不同”,对每个欧拉回路,1 号房间可以沿着任意一条出边出发,从而答案还要乘以 1 号房间的出度。 + **解** 本题是 BEST 定理的直接应用,但是要注意,由于题目规定“两种完成任务的方式算作不同当且仅当使用钥匙的顺序不同”,对每个欧拉回路,1 号房间可以沿着任意一条出边出发,从而答案还要乘以 1 号房间的出度。 ## 注释 diff --git a/docs/misc/mo-algo.md b/docs/misc/mo-algo.md index 3557ebf4..21260be6 100644 --- a/docs/misc/mo-algo.md +++ b/docs/misc/mo-algo.md @@ -221,7 +221,7 @@ struct node { 普通莫队是不能带修改的 -我们可以强行让它可以修改,就像 DP 一样,可以强行加上一维**时间维**, 表示这次操作的时间。 +我们可以强行让它可以修改,就像 DP 一样,可以强行加上一维 **时间维** , 表示这次操作的时间。 时间维表示经历的修改次数。 @@ -259,7 +259,7 @@ struct node { 我们不难发现,如果不带操作 1(修改)的话,我们就能轻松用普通莫队解决。 -但是题目还带单点修改,所以用**带修改的莫队**。 +但是题目还带单点修改,所以用 **带修改的莫队** 。 先考虑普通莫队的做法: diff --git a/docs/misc/odt.md b/docs/misc/odt.md index 44f6184e..7bd3611a 100644 --- a/docs/misc/odt.md +++ b/docs/misc/odt.md @@ -15,7 +15,7 @@ 骗分。 只要是有区间赋值操作的数据结构题都可以用来骗分。 -一般出题人不会**刻意**卡,但是不小心卡了就…… +一般出题人不会 **刻意** 卡,但是不小心卡了就…… 如果要保证复杂度正确,必须保证数据随机。 证明在[此](http://codeforces.com/blog/entry/56135?#comment-398940)。 diff --git a/docs/misc/simulated-annealing.md b/docs/misc/simulated-annealing.md index f44c7f90..24cc1f4e 100644 --- a/docs/misc/simulated-annealing.md +++ b/docs/misc/simulated-annealing.md @@ -8,7 +8,7 @@ 根据[爬山算法](/misc/hill-climbing/)的过程,我们发现:对于一个当前最优解附近的非最优解,爬山算法直接舍去了这个解。而很多情况下,我们需要去接受这个非最优解从而跳出这个局部最优解,即为模拟退火算法。 -> **什么是退火?**(选自百度百科) +> **什么是退火?** (选自百度百科) > > 退火是一种金属热处理工艺,指的是将金属缓慢加热到一定温度,保持足够时间,然后以适宜速度冷却。目的是降低硬度,改善切削加工性;消除残余应力,稳定尺寸,减少变形与裂纹倾向;细化晶粒,调整组织,消除组织缺陷。准确的说,退火是一种对材料的热处理工艺,包括金属材料、非金属材料。而且新材料的退火目的也与传统金属退火存在异同。 @@ -28,7 +28,7 @@ e^\frac{-\Delta E}{T}&\text{新状态更劣} \end{cases} $$ -**注意**:我们有时为了使得到的解更有质量,会在模拟退火结束后,以当前温度在得到的解附近多次随机状态,尝试得到更优的解(其过程与模拟退火相似)。 + **注意** :我们有时为了使得到的解更有质量,会在模拟退火结束后,以当前温度在得到的解附近多次随机状态,尝试得到更优的解(其过程与模拟退火相似)。 ### 如何退火(降温)? diff --git a/docs/search/astar.md b/docs/search/astar.md index 4982acf4..7fbbf093 100644 --- a/docs/search/astar.md +++ b/docs/search/astar.md @@ -8,11 +8,11 @@ A\*算法是[BFS](/search/bfs)的一种改进。 定义每个点的估价函数 $f(x)=g(x)+h(x)$ 。 -A\*算法每次从**优先队列**中取出一个 $f$ 最小的,然后更新相邻的状态。 +A\*算法每次从 **优先队列** 中取出一个 $f$ 最小的,然后更新相邻的状态。 如果 $h\leq h*$ ,则 A\*算法能找到最优解。 -上述条件下,如果 $h$ **满足三角形不等式,则 A\*算法不会将重复结点加入队列**。 +上述条件下,如果 $h$ **满足三角形不等式,则 A\*算法不会将重复结点加入队列** 。 其实…… $h=0$ 时就是[DFS](/search/dfs)算法, $h=0$ 并且边权为 $1$ 时就是[BFS](/search/BFS)。 diff --git a/docs/search/bfs.md b/docs/search/bfs.md index 39f5b50e..5ba24a02 100644 --- a/docs/search/bfs.md +++ b/docs/search/bfs.md @@ -5,7 +5,7 @@ BFS 全称是[Breadth First Search](https://en.wikipedia.org/wiki/Breadth-first_ 所谓宽度优先。就是每次都尝试访问同一层的节点。 如果同一层都访问完了,再访问下一层。 -这样做的结果是,BFS 算法找到的路径是从起点开始的**最短**合法路径。换言之,这条路所包含的边数最小。 +这样做的结果是,BFS 算法找到的路径是从起点开始的 **最短** 合法路径。换言之,这条路所包含的边数最小。 在 BFS 结束时,每个节点都是通过从起点到该点的最短路径访问的。 diff --git a/docs/search/idastar.md b/docs/search/idastar.md index e727948c..930af4e3 100644 --- a/docs/search/idastar.md +++ b/docs/search/idastar.md @@ -7,7 +7,7 @@ IDA\*,即采用迭代加深的 A\*算法。相对于 A\*算法,由于 IDA\* 1. 不需要判重,不需要排序; 2. 空间需求减少。 -**大致框架**(伪代码): + **大致框架** (伪代码): ```text Procedure IDA_STAR(StartState) @@ -43,7 +43,7 @@ end; ## 例题 -??? note "埃及分数"**题目描述** +??? note "埃及分数" **题目描述** 在古埃及,人们使用单位分数的和(即 $\frac{1}{a}$,$a$ 是自然数)表示一切有理数。例如,$\frac{2}{3}=\frac{1}{2}+\frac{1}{6}$,但不允许 $\frac{2}{3}=\frac{1}{3}+\frac{1}{3}$,因为在加数中不允许有相同的。 @@ -63,19 +63,19 @@ end; Case 1: 495/499=1/2+1/5+1/6+1/8+1/3992+1/14970 ``` -**分析** + **分析** -这道题目理论上可以用回溯法求解,但是**解答树**会非常“恐怖”—不仅深度没有明显的上界,而且加数的选择理论上也是无限的。换句话说,如果用宽度优先遍历,连一层都扩展不完,因为每一层都是**无限大**的。 +这道题目理论上可以用回溯法求解,但是 **解答树** 会非常“恐怖”—不仅深度没有明显的上界,而且加数的选择理论上也是无限的。换句话说,如果用宽度优先遍历,连一层都扩展不完,因为每一层都是 **无限大** 的。 解决方案是采用迭代加深搜索:从小到大枚举深度上限 $maxd$ ,每次执行只考虑深度不超过 $maxd$ 的节点。这样,只要解的深度优先,则一定可以在有限时间内枚举到。 -深度上限 $maxd$ 还可以用来**剪枝**。按照分母递增的顺序来进行扩展,如果扩展到 i 层时,前 $i$ 个分数之和为 $\frac{c}{d}$ ,而第 $i$ 个分数为 $\frac{1}{e}$ ,则接下来至少还需要 $\frac{\frac{a}{b}-\frac{c}{d}}{\frac{1}{e}}$ 个分数,总和才能达到 $\frac{a}{b}$ 。例如,当前搜索到 $\frac{19}{45}=\frac{1}{5}+\frac{1}{100}+\cdots$ ,则后面的分数每个最大为 $\frac{1}{101}$ ,至少需要 $\frac{\frac{19}{45}-\frac{1}{5}}{\frac{1}{101}}=23$ 项总和才能达到 $\frac{19}{45}$ ,因此前 $22$ 次迭代是根本不会考虑这棵子树的。这里的关键在于:可以估计至少还要多少步才能出解。 +深度上限 $maxd$ 还可以用来 **剪枝** 。按照分母递增的顺序来进行扩展,如果扩展到 i 层时,前 $i$ 个分数之和为 $\frac{c}{d}$ ,而第 $i$ 个分数为 $\frac{1}{e}$ ,则接下来至少还需要 $\frac{\frac{a}{b}-\frac{c}{d}}{\frac{1}{e}}$ 个分数,总和才能达到 $\frac{a}{b}$ 。例如,当前搜索到 $\frac{19}{45}=\frac{1}{5}+\frac{1}{100}+\cdots$ ,则后面的分数每个最大为 $\frac{1}{101}$ ,至少需要 $\frac{\frac{19}{45}-\frac{1}{5}}{\frac{1}{101}}=23$ 项总和才能达到 $\frac{19}{45}$ ,因此前 $22$ 次迭代是根本不会考虑这棵子树的。这里的关键在于:可以估计至少还要多少步才能出解。 -注意,这里的估计都是乐观的,因为用了**至少**这个词。说得学术一点,设深度上限为 $maxd$ ,当前结点 $n$ 的深度为 $g(n)$ ,乐观估价函数为 $h(n)$ ,则当 $g(n)+h(n)>maxd$ 时应该剪枝。这样的算法就是 IDA\*。当然,在实战中不需要严格地在代码里写出 $g(n)$ 和 $h(n)$ ,只需要像刚才那样设计出乐观估价函数,想清楚在什么情况下不可能在当前的深度限制下出解即可。 +注意,这里的估计都是乐观的,因为用了 **至少** 这个词。说得学术一点,设深度上限为 $maxd$ ,当前结点 $n$ 的深度为 $g(n)$ ,乐观估价函数为 $h(n)$ ,则当 $g(n)+h(n)>maxd$ 时应该剪枝。这样的算法就是 IDA\*。当然,在实战中不需要严格地在代码里写出 $g(n)$ 和 $h(n)$ ,只需要像刚才那样设计出乐观估价函数,想清楚在什么情况下不可能在当前的深度限制下出解即可。 > 如果可以设计出一个乐观估价函数,预测从当前结点至少还需要扩展几层结点才有可能得到解,则迭代加深搜索变成了 IDA\*算法。 -**代码** + **代码** ```cpp // 埃及分数问题 diff --git a/docs/search/index.md b/docs/search/index.md index 590c1cd1..8f5e9fa5 100644 --- a/docs/search/index.md +++ b/docs/search/index.md @@ -48,11 +48,11 @@ 也称折半搜索,主要思想是分治,通过将枚举量减少到原来的一半和特殊的合并技巧以使情况数减少到原来的 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) -我们正常想,如果这道题暴力 dfs 找开关灯的状态,时间复杂度就是 $O(2^{35})$ , 显然超时。不过,如果我们用**meet-in-middle**的话,时间复杂度将会变为 $O(2^{18} \times 2)$ 而已。**meet-in-middle**就是让我们先找一半的状态,也就是 $1$ 到 $mid$ ( $N$ 的一半)的状态,再找剩下的状态就可以了。我们把前半段的状态全部存储在 $hash$ 表或者 $map$ 里面,然后在找后半段的状态的时候,先判断后半段是不是都合法,就可以判断上半段有没有配对的上半段使得整段合法。 +我们正常想,如果这道题暴力 dfs 找开关灯的状态,时间复杂度就是 $O(2^{35})$ , 显然超时。不过,如果我们用 **meet-in-middle** 的话,时间复杂度将会变为 $O(2^{18} \times 2)$ 而已。 **meet-in-middle** 就是让我们先找一半的状态,也就是 $1$ 到 $mid$ ( $N$ 的一半)的状态,再找剩下的状态就可以了。我们把前半段的状态全部存储在 $hash$ 表或者 $map$ 里面,然后在找后半段的状态的时候,先判断后半段是不是都合法,就可以判断上半段有没有配对的上半段使得整段合法。 ## 经典题目 diff --git a/docs/search/iterative.md b/docs/search/iterative.md index 577e5599..9c5a8ea2 100644 --- a/docs/search/iterative.md +++ b/docs/search/iterative.md @@ -1,6 +1,6 @@ ## 简介 -迭代加深是一种**每次限制搜索深度的**深度优先搜索。 +迭代加深是一种 **每次限制搜索深度的** 深度优先搜索。 它的本质还是深度优先搜索,只不过在搜索的同时带上了一个深度 $d$ ,当 $d$ 达到设定的深度时就返回,一般用于找最优解。如果一次搜索没有找到合法的解,就让设定的深度 $+1$ ,重新从根开始。 diff --git a/docs/search/optimization.md b/docs/search/optimization.md index 6247d3dc..b36f72b3 100644 --- a/docs/search/optimization.md +++ b/docs/search/optimization.md @@ -29,7 +29,7 @@ void dfs(传入数值) { 因为在搜索中,相同的传入值往往会带来相同的解,那我们就可以用数组来记忆,详见[记忆化搜索](/dp/memo/)。 -**模板:** + **模板:** ```c++ int g[MAXN]; //定义记忆化数组 @@ -54,7 +54,7 @@ int main() { 在搜索中导致运行慢的原因还有一种,就是在当前解已经比已有解差时仍然在搜索,那么我们只需要判断一下当前解是否已经差于已有解。 -**模板:** + **模板:** ```c++ int ans = 最坏情况, now; @@ -72,7 +72,7 @@ void dfs(传入数值) { ### 可行性剪枝 -**模板:** + **模板:** 在搜索中如果当前解已经不可用了还运行,也是在搜索中导致运行慢的原因。 diff --git a/docs/string/manacher.md b/docs/string/manacher.md index d68cb939..abbb35f2 100644 --- a/docs/string/manacher.md +++ b/docs/string/manacher.md @@ -6,7 +6,7 @@ 显然在最坏情况下可能有 $O(n^2)$ 个回文串,因此似乎一眼看过去该问题并没有线性算法。 -但是关于回文串的信息可用**一种更紧凑的方式**表达:对于每个位置 $i = 0 \dots n - 1$ ,我们找出值 $d_1[i]$ 和 $d_2[i]$ 。二者分别表示以位置 $i$ 为中心的长度为奇数和长度为偶数的回文串个数。 +但是关于回文串的信息可用 **一种更紧凑的方式** 表达:对于每个位置 $i = 0 \dots n - 1$ ,我们找出值 $d_1[i]$ 和 $d_2[i]$ 。二者分别表示以位置 $i$ 为中心的长度为奇数和长度为偶数的回文串个数。 举例来说,字符串 $s = \mathtt{abababc}$ 以 $s[3] = b$ 为中心有三个奇数长度的回文串,也即 $d_1[3] = 3$ : @@ -28,7 +28,7 @@ $$ 总的来说,该问题具有多种解法:应用字符串哈希,该问题可在 $O(n \log n)$ 时间内解决,而使用后缀数组和快速 LCA 该问题可在 $O(n)$ 时间内解决。 -但是这里描述的算法**压倒性**的简单,并且在时间和空间复杂度上具有更小的常数。该算法由**Glenn K. Manacher**在 1975 年提出。 +但是这里描述的算法 **压倒性** 的简单,并且在时间和空间复杂度上具有更小的常数。该算法由 **Glenn K. Manacher** 在 1975 年提出。 ## 朴素算法 @@ -60,7 +60,7 @@ for (int i = 0; i < n; i++) { 这里我们将只描述算法中寻找所有奇数长度子回文串的情况,即只计算 $d_1[]$ ;寻找所有偶数长度子回文串的算法(即计算数组 $d_2[]$ )将只需对奇数情况下的算法进行一些小修改。 -为了快速计算,我们维护已找到的子回文串的最靠右的**边界 $(l, r)$ **(即具有最大 $r$ 值的回文串)。初始时,我们置 $l = 0$ 和 $r = -1$ 。 +为了快速计算,我们维护已找到的子回文串的最靠右的 **边界 $(l, r)$ ** (即具有最大 $r$ 值的回文串)。初始时,我们置 $l = 0$ 和 $r = -1$ 。 现在假设我们要对下一个 $i$ 计算 $d_1[i]$ ,而之前所有 $d_1[]$ 中的值已计算完毕。我们将通过下列方式计算: @@ -68,7 +68,7 @@ for (int i = 0; i < n; i++) { 因此我们将连续的增加 $d_1[i]$ ,同时在每一步中检查当前的子串 $[i - d_1[i] \dots i + d_1[i]]$ 是否为一个回文串。如果我们找到了第一处对应字符不同,又或者碰到了 $s$ 的边界,则算法停止。在两种情况下我们均已计算完 $d_1[i]$ 。此后,仍需记得更新 $(l, r)$ 。 -- 现在考虑 $i \le r$ 的情况。我们将尝试从已计算过的 $d_1[]$ 的值中获取一些信息。首先在子回文串 $(l, r)$ 中反转位置 $i$ ,即我们得到 $j = l + (r - i)$ 。现在来考察值 $d_1[j]$ 。因为位置 $j$ 同位置 $i$ 对称,我们**几乎总是**可以置 $d_1[i] = d_1[j]$ 。该想法的图示如下(可认为以 $j$ 为中心的回文串被“拷贝”至以 $i$ 为中心的位置上): +- 现在考虑 $i \le r$ 的情况。我们将尝试从已计算过的 $d_1[]$ 的值中获取一些信息。首先在子回文串 $(l, r)$ 中反转位置 $i$ ,即我们得到 $j = l + (r - i)$ 。现在来考察值 $d_1[j]$ 。因为位置 $j$ 同位置 $i$ 对称,我们 **几乎总是** 可以置 $d_1[i] = d_1[j]$ 。该想法的图示如下(可认为以 $j$ 为中心的回文串被“拷贝”至以 $i$ 为中心的位置上): $$ \ldots\ @@ -86,7 +86,7 @@ for (int i = 0; i < n; i++) { \ldots $$ - 然而有一个**棘手的情况**需要被正确处理:当“内部”的回文串到达“外部”回文串的边界时,即 $j - d_1[j] + 1 \le l$ (或者等价的说, $i + d_1[j] - 1 \ge r$ )。因为在“外部”回文串范围以外的对称性没有保证,因此直接置 $d_1[i] = d_1[j]$ 将是不正确的:我们没有足够的信息来断言在位置 $i$ 的回文串具有同样的长度。 + 然而有一个 **棘手的情况** 需要被正确处理:当“内部”的回文串到达“外部”回文串的边界时,即 $j - d_1[j] + 1 \le l$ (或者等价的说, $i + d_1[j] - 1 \ge r$ )。因为在“外部”回文串范围以外的对称性没有保证,因此直接置 $d_1[i] = d_1[j]$ 将是不正确的:我们没有足够的信息来断言在位置 $i$ 的回文串具有同样的长度。 实际上,为了正确处理这种情况,我们应该“截断”回文串的长度,即置 $d_1[i] = r - i$ 。之后我们将运行朴素算法以尝试尽可能增加 $d_1[i]$ 的值。 @@ -170,7 +170,7 @@ for (int i = 0, l = 0, r = -1; i < n; i++) { 对于字母间的 $\#$ ,其实际意义为 $s$ 中对应的“空”。而两端的 $\#$ 则是为了实现的方便。 -注意到,在对 $s'$ 计算 $d_1[]$ 后,对于一个位置 $i$ , $d_1[i]$ 所描述的最长的子回文串必定以 $\#$ 结尾(若以字母结尾,由于字母两侧必定各有一个 $\#$ ,因此可向外扩展一个得到一个更长的)。因此,对于 $s$ 中一个以字母为中心的极大子回文串,设其长度为 $m + 1$ ,则其在 $s'$ 中对应一个以相应字母为中心,长度为 $2m + 3$ 的极大子回文串;而对于 $s$ 中一个以空为中心的极大子回文串,设其长度为 $m$ ,则其在 $s'$ 中对应一个以相应表示空的 $\#$ 为中心,长度为 $2m + 1$ 的极大子回文串(上述两种情况下的 $m$ 均为偶数,但该性质成立与否并不影响结论)。综合以上观察及少许计算后易得,在 $s'$ 中, $d_1[i]$ 表示在 $s​$ 中以对应位置为中心的极大子回文串的**总长度加一**。 +注意到,在对 $s'$ 计算 $d_1[]$ 后,对于一个位置 $i$ , $d_1[i]$ 所描述的最长的子回文串必定以 $\#$ 结尾(若以字母结尾,由于字母两侧必定各有一个 $\#$ ,因此可向外扩展一个得到一个更长的)。因此,对于 $s$ 中一个以字母为中心的极大子回文串,设其长度为 $m + 1$ ,则其在 $s'$ 中对应一个以相应字母为中心,长度为 $2m + 3$ 的极大子回文串;而对于 $s$ 中一个以空为中心的极大子回文串,设其长度为 $m$ ,则其在 $s'$ 中对应一个以相应表示空的 $\#$ 为中心,长度为 $2m + 1$ 的极大子回文串(上述两种情况下的 $m$ 均为偶数,但该性质成立与否并不影响结论)。综合以上观察及少许计算后易得,在 $s'$ 中, $d_1[i]$ 表示在 $s​$ 中以对应位置为中心的极大子回文串的 **总长度加一** 。 上述结论建立了 $s'$ 的 $d_1[]$ 同 $s$ 的 $d_1[]$ 和 $d_2[]$ 间的关系。 @@ -183,4 +183,4 @@ for (int i = 0, l = 0, r = -1; i < n; i++) { * * * -**本页面主要译自博文[Нахождение всех подпалиндромов](http://e-maxx.ru/algo/palindromes_count)与其英文翻译版[Finding all sub-palindromes in $O(N)$ ](https://cp-algorithms.com/string/manacher.html)。其中俄文版版权协议为 Public Domain + Leave a Link;英文版版权协议为 CC-BY-SA 4.0。** + **本页面主要译自博文[Нахождение всех подпалиндромов](http://e-maxx.ru/algo/palindromes_count)与其英文翻译版[Finding all sub-palindromes in $O(N)$ ](https://cp-algorithms.com/string/manacher.html)。其中俄文版版权协议为 Public Domain + Leave a Link;英文版版权协议为 CC-BY-SA 4.0。** diff --git a/docs/string/prefix-function.md b/docs/string/prefix-function.md index b291fc56..a73abe23 100644 --- a/docs/string/prefix-function.md +++ b/docs/string/prefix-function.md @@ -1,6 +1,6 @@ ## 前缀函数定义 -给定一个长度为 $n$ 的字符串 $s$ ,其**前缀函数**被定义为一个长度为 $n$ 的数组 $\pi$ 。其中 $\pi[i]$ 为既是子串 $s[0\dots i]$ 的前缀同时也是该子串的后缀的最长真前缀(proper prefix)长度。一个字符串的真前缀是其前缀但不等于该字符串自身。根据定义, $\pi[0] = 0$ 。 +给定一个长度为 $n$ 的字符串 $s$ ,其 **前缀函数** 被定义为一个长度为 $n$ 的数组 $\pi$ 。其中 $\pi[i]$ 为既是子串 $s[0\dots i]$ 的前缀同时也是该子串的后缀的最长真前缀(proper prefix)长度。一个字符串的真前缀是其前缀但不等于该字符串自身。根据定义, $\pi[0] = 0$ 。 前缀函数的定义可用数学语言描述如下: @@ -100,7 +100,7 @@ vector prefix_function(string s) { } ``` -这是一个**在线**算法,即其当数据到达时处理它——举例来说,你可以一个字符一个字符的读取字符串,立即处理它们以计算出每个字符的前缀函数值。该算法仍然需要存储字符串本身以及先前计算过的前缀函数值,但如果我们已经预先知道该字符串前缀函数的最大可能取值 $M$ ,那么我们仅需要存储该字符串的前 $M + 1$ 个字符以及对应的前缀函数值。 +这是一个 **在线** 算法,即其当数据到达时处理它——举例来说,你可以一个字符一个字符的读取字符串,立即处理它们以计算出每个字符的前缀函数值。该算法仍然需要存储字符串本身以及先前计算过的前缀函数值,但如果我们已经预先知道该字符串前缀函数的最大可能取值 $M$ ,那么我们仅需要存储该字符串的前 $M + 1$ 个字符以及对应的前缀函数值。 ## 应用 @@ -192,7 +192,7 @@ $$ 实际上在这种情况下,知道 $t$ 的下一个字符 $c$ 以及之前位置的前缀函数值便足以计算下一个位置的前缀函数值,而不需要用到任何其它 $t$ 的字符和对应的前缀函数值。 -换句话说,我们可以构造一个**自动机**(一个有限状态机):其状态为当前的前缀函数值,而从一个状态到另一个状态的转移则由下一个字符确定。 +换句话说,我们可以构造一个 **自动机** (一个有限状态机):其状态为当前的前缀函数值,而从一个状态到另一个状态的转移则由下一个字符确定。 因此,即使没有字符串 $t$ ,我们同样可以应用构造转移表的算法构造一个转移表 $( \text { old } \pi , c ) \rightarrow \text { new } _ { - } \pi$ : @@ -236,11 +236,11 @@ void compute_automaton(string s, vector>& aut) { 该自动机在什么时候有用呢?首先,记得大部分时候我们为了一个目的使用字符串 $s + \# + t$ 的前缀函数:寻找字符串 $s$ 在字符串 $t$ 中的所有出现。 -因此使用该自动机的最直接的好处是**加速计算字符串 $s + \# + t$ 的前缀函数**。 +因此使用该自动机的最直接的好处是 **加速计算字符串 $s + \# + t$ 的前缀函数** 。 通过构建 $s + \#$ 的自动机,我们不再需要存储字符串 $s$ 以及其对应的前缀函数值。所有转移已经在表中计算过了。 -但除此以外,还有第二个不那么直接的应用。我们可以在字符串 $t$ 是**某些通过一些规则构造的巨型字符串**时,使用该自动机加速计算。Gray 字符串,或者一个由一些短的输入串的递归组合所构造的字符串都是这种例子。 +但除此以外,还有第二个不那么直接的应用。我们可以在字符串 $t$ 是 **某些通过一些规则构造的巨型字符串** 时,使用该自动机加速计算。Gray 字符串,或者一个由一些短的输入串的递归组合所构造的字符串都是这种例子。 出于完整性考虑,我们来解决这样一个问题:给定一个数 $k \le 10^5$ ,以及一个长度 $\le 10^5$ 的字符串 $s$ ,我们需要计算 $s$ 在第 $k$ 个 Gray 字符串中的出现次数。回想起 Gray 字符串以下述方式定义: @@ -301,4 +301,4 @@ $$ * * * -**本页面主要译自博文[Префикс-функция. Алгоритм Кнута-Морриса-Пратта](http://e-maxx.ru/algo/prefix_function)与其英文翻译版[Prefix function. Knuth–Morris–Pratt algorithm](https://cp-algorithms.com/string/prefix-function.html)。其中俄文版版权协议为 Public Domain + Leave a Link;英文版版权协议为 CC-BY-SA 4.0。** + **本页面主要译自博文[Префикс-функция. Алгоритм Кнута-Морриса-Пратта](http://e-maxx.ru/algo/prefix_function)与其英文翻译版[Prefix function. Knuth–Morris–Pratt algorithm](https://cp-algorithms.com/string/prefix-function.html)。其中俄文版版权协议为 Public Domain + Leave a Link;英文版版权协议为 CC-BY-SA 4.0。** diff --git a/docs/string/sa.md b/docs/string/sa.md index 01421e20..32a5dc05 100644 --- a/docs/string/sa.md +++ b/docs/string/sa.md @@ -55,7 +55,7 @@ int main() { ### 倍增法 -这个就是一般写后缀数组用的方法,复杂度是 $O(n\log n)$ ,前提是你要先会**基数排序**。 +这个就是一般写后缀数组用的方法,复杂度是 $O(n\log n)$ ,前提是你要先会 **基数排序** 。 假设我们有这样一个字符串 `aabaaaab` ,然后我们把所有的后缀列举出来: @@ -73,7 +73,7 @@ int main() { 第三字母同理…… -这样子我们可以处理这个问题,可是复杂度还是没有到达一个我们可以接受的范围,所以我们引入**倍增**。 +这样子我们可以处理这个问题,可是复杂度还是没有到达一个我们可以接受的范围,所以我们引入 **倍增** 。 当我们按照每个后缀的前 $2^k$ 个字母进行完排序后,那么我们把后缀的前 $2^{k+1}$ 看做前后两个 $2^k$ , 这样我们就可以把这前后两个 $2^k$ 作为之前说的首字母和第二个字母了,然后进行上述过程,就可以在 $O(nlogn)$ 的复杂度内处理这个问题了。 @@ -128,7 +128,7 @@ int main() { 代码里 $x[i]$ 就是 $rank[i]$ 。 - $y[i]$ :假设 $y[i]=a\ ,\ y[i+1]=b$ 那么在原串中从 $a+2^k$ 开始的 $2^k$ 个字符组成的子串**小于等于**从 $b+2^k$ 开始的 $2^k$ 个字符组成的子串。 + $y[i]$ :假设 $y[i]=a\ ,\ y[i+1]=b$ 那么在原串中从 $a+2^k$ 开始的 $2^k$ 个字符组成的子串 **小于等于** 从 $b+2^k$ 开始的 $2^k$ 个字符组成的子串。 最好理解这个代码时,每一步都结合这基数排序来考虑。 diff --git a/docs/string/sam.md b/docs/string/sam.md index 65684b3c..e077834a 100644 --- a/docs/string/sam.md +++ b/docs/string/sam.md @@ -1,4 +1,4 @@ -**后缀自动机**是一个能解决许多字符串相关问题的有力的数据结构。 + **后缀自动机** 是一个能解决许多字符串相关问题的有力的数据结构。 举个例子,字符串问题: @@ -7,25 +7,25 @@ 以上问题都可以在线性的时间复杂度内通过后缀自动机来实现。 -直观上,字符串的后缀自动机可以理解为给定字符串的**所有子串**的压缩形式。值得注意的事实是,后缀自动机将所有的这些信息以高度压缩的形式储存。对于一个长度为 $n$ 的字符串,它的空间复杂度仅为 $O(n)$ 。此外,构造后缀自动机的时间复杂度仅为 $O(n)$ (这里我们将字符集的大小 $k$ 看作常数,否则时间复杂度和空间复杂度均为 $O(n\log k)$ )。 +直观上,字符串的后缀自动机可以理解为给定字符串的 **所有子串** 的压缩形式。值得注意的事实是,后缀自动机将所有的这些信息以高度压缩的形式储存。对于一个长度为 $n$ 的字符串,它的空间复杂度仅为 $O(n)$ 。此外,构造后缀自动机的时间复杂度仅为 $O(n)$ (这里我们将字符集的大小 $k$ 看作常数,否则时间复杂度和空间复杂度均为 $O(n\log k)$ )。 ## 后缀自动机的定义 -给定字符串 $s$ 的后缀自动机是一个接受所有字符串 $s$ 的后缀的最小**DFA**(确定性有限自动机或确定性有限状态自动机)。 +给定字符串 $s$ 的后缀自动机是一个接受所有字符串 $s$ 的后缀的最小 **DFA** (确定性有限自动机或确定性有限状态自动机)。 换句话说: -- 后缀自动机是一张有向无环图。顶点被称作**状态**,边被称作状态间的**转移**。 -- 一个状态 $t_0$ 为**初始状态**,它必定为这张图的源点(其它各点均与 $t_0$ 连通)。 -- 每个**转移**都标有一些字母。从一个顶点出发的所有转移均**不同**。 -- 一个或多个状态为**终止状态**。如果我们从初始状态 $t_0$ 出发,最终转移到了一个终止状态,则路径上的所有转移连接起来一定是字符串 $s$ 的一个后缀。 $s$ 的每个后缀均可用一条从 $t_0$ 到一个终止状态的路径构成。 +- 后缀自动机是一张有向无环图。顶点被称作 **状态** ,边被称作状态间的 **转移** 。 +- 一个状态 $t_0$ 为 **初始状态** ,它必定为这张图的源点(其它各点均与 $t_0$ 连通)。 +- 每个 **转移** 都标有一些字母。从一个顶点出发的所有转移均 **不同** 。 +- 一个或多个状态为 **终止状态** 。如果我们从初始状态 $t_0$ 出发,最终转移到了一个终止状态,则路径上的所有转移连接起来一定是字符串 $s$ 的一个后缀。 $s$ 的每个后缀均可用一条从 $t_0$ 到一个终止状态的路径构成。 - 后缀自动机是所有满足上述条件的自动机中顶点数最少的一个。 ### 子串的性质 -后缀自动机最简单和最重要的性质是,它包含关于字符串 $s$ 的所有子串的信息。任意从初始状态 $t_0$ 开始的路径,如果我们将转移路径上的标号写下来,都会形成 $s$ 的一个**子串**。反之每个 $s$ 的子串对应于从 $t_0$ 开始的某条路径。 +后缀自动机最简单和最重要的性质是,它包含关于字符串 $s$ 的所有子串的信息。任意从初始状态 $t_0$ 开始的路径,如果我们将转移路径上的标号写下来,都会形成 $s$ 的一个 **子串** 。反之每个 $s$ 的子串对应于从 $t_0$ 开始的某条路径。 -为了简化表达,我们将会说子串**对应于**一条路径(从 $t_0$ 开始且一些标号构成这个子串)。反过来我们说任意一条路径**对应于**它的标号构成的字符串。 +为了简化表达,我们将会说子串 **对应于** 一条路径(从 $t_0$ 开始且一些标号构成这个子串)。反过来我们说任意一条路径 **对应于** 它的标号构成的字符串。 一条或多条路径可以到达一个状态,因此我们说一个状态对应于字符串的集合,这也对应于那些路径。 @@ -67,7 +67,7 @@

考虑字符串 s 的任意非空子串 t ,我们记 endpos(t) 为在字符串 s 中 t 的所有结束位置(假设对字符串中字符的编号从零开始)。例如,对于字符串 ``abcbc\!",我们有 endpos(``bc\!")=2,\,4。

-当两个子串 $t_1$ 与 $t_2$ 的末尾集合相等时我们称它们是 $endpos$ 等价的:即 $endpos(t_1)=endpos(t_2)$ 。这样所有字符串 $s$ 的非空子串都可以根据它们的** $endpos$ **集合被分为几个**等价类**。 +当两个子串 $t_1$ 与 $t_2$ 的末尾集合相等时我们称它们是 $endpos$ 等价的:即 $endpos(t_1)=endpos(t_2)$ 。这样所有字符串 $s$ 的非空子串都可以根据它们的 ** $endpos$ ** 集合被分为几个 **等价类** 。 显然,在后缀自动机中的每个状态对应于一个或多个 $endpos$ 相同的子串。换句话说,后缀自动机中的状态数等于所有子串的等价类的个数,加上初始状态。后缀自动机的状态个数等价于 $endpos$ 相同的一个或多个子串所组成的集合的个数 $+1$ 。 @@ -75,11 +75,11 @@ 由 $endpos$ 的值我们可以得到一些重要结论: -> **引理 1:**当且仅当字符串 $u$ 以 $w$ 的一个后缀的形式出现在字符串 $s$ 中时,两个非空子串 $u$ 和 $w$ (假设 $length(u)\le length(w)$ )是 $endpos$ 等价的。 +> **引理 1:** 当且仅当字符串 $u$ 以 $w$ 的一个后缀的形式出现在字符串 $s$ 中时,两个非空子串 $u$ 和 $w$ (假设 $length(u)\le length(w)$ )是 $endpos$ 等价的。 引理显然成立。如果 $u$ 和 $v$ 的 $endpos$ 相同,则 $u$ 是 $w$ 的一个后缀,且只以 $s$ 中的一个 $w$ 的后缀的形式出现。且根据定义,如果 $u$ 为 $w$ 的一个后缀,且只以后缀的形式在 $s$ 中出现时,两个子串的 $endpos$ 值相等。 -> **引理 2:**考虑两个非空子串 $u$ 和 $w$ (假设 $length(u)\le length(w)$ )。则它们的 $endpos$ 构成的集合要么完全没有交集,要么 $endpos(w)$ 是 $endpos(u)$ 的一个子集。并且这依赖于 $u$ 是否为 $w$ 的一个后缀。即: +> **引理 2:** 考虑两个非空子串 $u$ 和 $w$ (假设 $length(u)\le length(w)$ )。则它们的 $endpos$ 构成的集合要么完全没有交集,要么 $endpos(w)$ 是 $endpos(u)$ 的一个子集。并且这依赖于 $u$ 是否为 $w$ 的一个后缀。即: > > $$ > \begin{cases} @@ -90,7 +90,7 @@ 证明:如果集合 $endpos(u)$ 与 $endpos(w)$ 有至少一个公共元素,那么由于字符串 $u$ 与 $w$ 都在一个位置结束,即 $u$ 是 $w$ 的一个后缀。但是如果如此在每次 $w$ 出现的位置子串 $u$ 也会出现,这意味着 $endpos(w)$ 是 $endpos(u)$ 的一个子集。 -> **引理 3:**考虑一个 $endpos$ 等价类。将类中的所有子串按长度非递增的顺序排序。即每个子串都会比它前一个子串短,与此同时每个子串也是它前一个子串的一个后缀。换句话说,同一等价类中任两子串中较短者为较长者后缀,且该类中的子串长度恰好覆盖整个区间 $[x,\,y]$ 。 +> **引理 3:** 考虑一个 $endpos$ 等价类。将类中的所有子串按长度非递增的顺序排序。即每个子串都会比它前一个子串短,与此同时每个子串也是它前一个子串的一个后缀。换句话说,同一等价类中任两子串中较短者为较长者后缀,且该类中的子串长度恰好覆盖整个区间 $[x,\,y]$ 。 证明:固定一些 $endpos$ 等价类。如果等价类中只包含一个子串,引理显然成立。现在我们来讨论子串元素个数大于 $1$ 的等价类。 @@ -104,15 +104,15 @@ 我们还知道字符串 $w$ 的前几个后缀(如果我们用长度降序考虑这些后缀)在这个等价类中全部被包含,且所有其它后缀(至少一个—空后缀)在其它的等价类中。我们记 $t$ 为最大的这样的后缀,然后用后缀链接连到 $t$ 上。 -换句话说,一个**后缀链接** $link(v)$ 连接到对应于 $w$ 的最长后缀的另一个 $endpos$ 等价类的状态。 +换句话说,一个 **后缀链接** $link(v)$ 连接到对应于 $w$ 的最长后缀的另一个 $endpos$ 等价类的状态。 以下我们假设初始状态 $t_0$ 对应于它自己这个等价类(只包含一个空字符串),为了方便我们规定 $endpos(t)=\{-1,\,0,\,\ldots,\,length(s)-1\}$ 。 -> **引理 4:**所有后缀链接构成一棵根节点为 $t_0$ 的树。 +> **引理 4:** 所有后缀链接构成一棵根节点为 $t_0$ 的树。 证明:考虑任意满足 $v\ne t_0$ 的状态,一个后缀链接 $link(v)$ 连接到的状态对应于严格更短的字符串(根据后缀链接的定义和引理 3)。因此,通过在后缀链接上移动,我们早晚会到达对应空串的初始状态 $t_0$ 。 -> **引理 5:**如果我们使用集合 $endpos$ 构造一棵树(所有子节点的集合为父节点的子集),则这个结构由后缀链接连接起来。 +> **引理 5:** 如果我们使用集合 $endpos$ 构造一棵树(所有子节点的集合为父节点的子集),则这个结构由后缀链接连接起来。 证明:由引理 2,我们可以用 $endpos$ 集合构造一棵树(因为两个集合要么完全没有交集要么其中一个是另一个的子集)。 @@ -124,7 +124,7 @@ $$ ,这与前面的引理证明了以下断言成立:后缀链接构成的树本质上是 $endpos$ 集合构成的一棵树。 -以下是对于字符串 $``abcbc\!"$ 构造后缀自动机时产生的后缀链接树的一个**例子**,节点被标记为对应等价类中最长的子串。 +以下是对于字符串 $``abcbc\!"$ 构造后缀自动机时产生的后缀链接树的一个 **例子** ,节点被标记为对应等价类中最长的子串。 ![](./images/SAM/SA_suffix_links.svg) @@ -146,7 +146,7 @@ $$ ### 算法 -现在我们可以学习算法本身了。这个算法是**在线**算法,这意味着我们可以逐个加入字符串中的每个字符,并且在每一步中对应地维护后缀自动机。 +现在我们可以学习算法本身了。这个算法是 **在线** 算法,这意味着我们可以逐个加入字符串中的每个字符,并且在每一步中对应地维护后缀自动机。 为了保证线性的空间复杂度,我们将只保存 $len$ 和 $link$ 的值和每个状态的一个转移列表,我们不会标记终止状态(但是我们稍后会展示在构造后缀自动机后如何分配这些标记)。 @@ -161,36 +161,36 @@ $$ - 假设现在我们找到了一个状态 $p$ ,其可以转移到字符 $c$ ,我们将这个状态转移到的状态标记为 $q$ 。 - 现在我们分类讨论两种状态,要么 $len(p) + 1 = len(q)$ ,要么不是。 - 如果 $len(p)+1=len(q)$ ,我们只要将 $link(cur)$ 赋值为 $q$ 并退出。 -- 否则就会有些复杂。需要**复制**状态 $q$ :我们创建一个新的状态 $clone$ ,复制 $q$ 的除了 $len$ 的值以外的所有信息(后缀链接和转移)。我们将 $len(clone)$ 赋值为 $len(p)+1$ 。 +- 否则就会有些复杂。需要 **复制** 状态 $q$ :我们创建一个新的状态 $clone$ ,复制 $q$ 的除了 $len$ 的值以外的所有信息(后缀链接和转移)。我们将 $len(clone)$ 赋值为 $len(p)+1$ 。 复制之后,我们将后缀链接从 $cur$ 指向 $clone$ ,也从 $q$ 指向 $clone$ 。 最终我们需要使用后缀链接从状态 $p$ 返回,因为存在一条通过 $c$ 到状态 $q$ 的转移,并在此过程中重定向所有状态到状态 $clone$ 。 - 以上三种情况,在完成这个过程之后,我们将 $last$ 的值更新为状态 $cur$ 。 -如果我们还想知道哪些状态是**终止状态**而哪些不是,我们可以在为字符串 $s$ 构造完完整的后缀自动机后找到所有的终止状态。为此,我们从对应整个字符串的状态(存储在变量 $last$ 中),遍历它的后缀链接,直到到达初始状态。我们将所有遍历到的节点都标记为终止节点。容易理解这样做我们会精确地标记字符串 $s$ 的所有后缀,这些状态恰好是终止状态。 +如果我们还想知道哪些状态是 **终止状态** 而哪些不是,我们可以在为字符串 $s$ 构造完完整的后缀自动机后找到所有的终止状态。为此,我们从对应整个字符串的状态(存储在变量 $last$ 中),遍历它的后缀链接,直到到达初始状态。我们将所有遍历到的节点都标记为终止节点。容易理解这样做我们会精确地标记字符串 $s$ 的所有后缀,这些状态恰好是终止状态。 -在下一部分,我们将观察算法每一步的细节,并证明它的**正确性**。 +在下一部分,我们将观察算法每一步的细节,并证明它的 **正确性** 。 -现在,我们只注意到,因为我们只为 $s$ 的每个字符创建一个或两个新状态所以后缀自动机只包含**线性个**状态。 +现在,我们只注意到,因为我们只为 $s$ 的每个字符创建一个或两个新状态所以后缀自动机只包含 **线性个** 状态。 转移个数是线性规模的,以及总体上算法的运行时间是线性规模的,这两点还不那么清楚。 ### 正确性证明 -- 若一个转移 $(p,\,q)$ 满足 $len(p)+1=len(q)$ 则我们称这个转移是**连续的**。否则,即当 $len(p)+1len(p)+1$ 。这种情况下,我们必须要通过拆开状态 $q$ 来创建一个这样的状态。 +- 第二种情况下,我们找到了现有的转移 $(p,\,q)$ 。这意味着我们尝试向自动机内添加一个 **已经存在的** 字符串 $x+c$ (其中 $x$ 为 $s$ 的一个后缀,且字符串 $x+c$ 已经作为 $s$ 的一个子串出现过了)。因为我们假设字符串 $s$ 的自动机的构造是正确的,我们不应该在这里添加一个新的转移。然而,有一个难点。从状态 $cur$ 出发的后缀链接应该连接到哪个状态呢?我们要把后缀链接连到一个状态上,且其中最长的一个字符串恰好是 $x+c$ ,即这个状态的 $len$ 应该是 $len(p)+1$ 。然而还不存在这样的状态,即 $len(q)>len(p)+1$ 。这种情况下,我们必须要通过拆开状态 $q$ 来创建一个这样的状态。 - 如果转移 $(p,\,q)$ 是连续的,那么 $len(q)=len(p)+1$ 。在这种情况下一切都很简单。我们只需要将 $cur$ 的后缀链接指向状态 $q$ 。 - 否则转移是不连续的,即 $len(q)>len(p)+1$ ,这意味着状态 $q$ 不只对应于长度为 $len(p)+1$ 的后缀 $s+c$ ,还对应于 $s$ 的更长的子串。除了将状态 $q$ 拆成两个子状态以外我们别无他法,所以第一个子状态的长度就是 $len(p)+1$ 了。 - 我们如何拆开一个状态呢?我们**复制**状态 $q$ ,产生一个状态 $clone$ ,我们将 $len(clone)$ 赋值为 $len(p)+1$ 。由于我们不想改变遍历到 $q$ 的路径,我们将 $q$ 的所有转移复制到 $clone$ 。我们也将从 $clone$ 出发的后缀链接设置为 $q$ 的后缀链接的目标,并设置 $q$ 的后缀链接为 $clone$ 。 + 我们如何拆开一个状态呢?我们 **复制** 状态 $q$ ,产生一个状态 $clone$ ,我们将 $len(clone)$ 赋值为 $len(p)+1$ 。由于我们不想改变遍历到 $q$ 的路径,我们将 $q$ 的所有转移复制到 $clone$ 。我们也将从 $clone$ 出发的后缀链接设置为 $q$ 的后缀链接的目标,并设置 $q$ 的后缀链接为 $clone$ 。 在拆开状态后,我们将从 $cur$ 出发的后缀链接设置为 $clone$ 。 最后一步我们将一些到 $q$ 转移重定向到 $clone$ 。我们需要修改哪些转移呢?只重定向相当于所有字符串 $w+c$ (其中 $w$ 是 $p$ 的最长字符串)的后缀就够了。即,我们需要继续沿着后缀链接遍历,从顶点 $p$ 直到虚拟状态 $-1$ 或者是转移到不是状态 $q$ 的一个转移。 ### 对操作次数为线性的证明 -首先我们假设字符集大小为**常数**。如果字符集大小不是常数,后缀自动机的时间复杂度就不是线性的。从一个顶点出发的转移存储在支持快速查询和插入的平衡树中。因此如果我们记 $k$ 为字符集的大小,则算法的渐进时间复杂度为 $O(n\log k)$ ,空间复杂度为 $O(n)$ 。然而如果字符集足够小,可以不写平衡树,以空间换时间将每个顶点的转移存储为长度为 $k$ 的数组(用于快速查询)和链表(用于快速遍历所有可用关键字)。这样算法的时间复杂度为 $O(n)$ ,空间复杂度为 $O(nk)$ 。 +首先我们假设字符集大小为 **常数** 。如果字符集大小不是常数,后缀自动机的时间复杂度就不是线性的。从一个顶点出发的转移存储在支持快速查询和插入的平衡树中。因此如果我们记 $k$ 为字符集的大小,则算法的渐进时间复杂度为 $O(n\log k)$ ,空间复杂度为 $O(n)$ 。然而如果字符集足够小,可以不写平衡树,以空间换时间将每个顶点的转移存储为长度为 $k$ 的数组(用于快速查询)和链表(用于快速遍历所有可用关键字)。这样算法的时间复杂度为 $O(n)$ ,空间复杂度为 $O(nk)$ 。 所以我们将认为字符集的大小为常数,即每次对一个字符搜索转移、添加转移、查找下一个转移—这些操作的时间复杂度都为 $O(1)$ 。 @@ -200,11 +200,11 @@ $$ - 第二处是当状态 $q$ 被复制到一个新的状态 $clone$ 时复制转移的过程。 - 第三处是修改指向 $q$ 的转移,将它们重定向到 $clone$ 的过程。 -我们使用后缀自动机的大小(状态数和转移数)为**线性的**的事实(对状态数是线性的的证明就是算法本身,对转移数为线性的的证明将在稍后实现算法后给出)。 +我们使用后缀自动机的大小(状态数和转移数)为 **线性的** 的事实(对状态数是线性的的证明就是算法本身,对转移数为线性的的证明将在稍后实现算法后给出)。 -因此上述**第一处和第二处**的总复杂度显然为线性的,因为单次操作均摊只为自动机添加了一个新转移。 +因此上述 **第一处和第二处** 的总复杂度显然为线性的,因为单次操作均摊只为自动机添加了一个新转移。 -还需为**第三处**估计总复杂度,我们将最初指向 $q$ 的转移重定向到 $clone$ 。我们记 $v=longest(p)$ ,这是一个字符串 $s$ 的后缀,每次迭代长度都递减—因为作为字符串 $s$ 的位置随着每次迭代都单调上升。这种情况下,如果在循环的第一次迭代之前,相对应的字符串 $v$ 在距离 $last$ 的深度为 $k$ $(k\ge2)$ 的位置上(深度记为后缀链接的数量),那么在最后一次迭代后,字符串 $v+c$ 将会成为路径上第二个从 $cur$ 出发的后缀链接(它将会成为新的 $last$ 的值)。 +还需为 **第三处** 估计总复杂度,我们将最初指向 $q$ 的转移重定向到 $clone$ 。我们记 $v=longest(p)$ ,这是一个字符串 $s$ 的后缀,每次迭代长度都递减—因为作为字符串 $s$ 的位置随着每次迭代都单调上升。这种情况下,如果在循环的第一次迭代之前,相对应的字符串 $v$ 在距离 $last$ 的深度为 $k$ $(k\ge2)$ 的位置上(深度记为后缀链接的数量),那么在最后一次迭代后,字符串 $v+c$ 将会成为路径上第二个从 $cur$ 出发的后缀链接(它将会成为新的 $last$ 的值)。 因此,循环中的每次迭代都会使作为当前字符串的后缀的字符串 $longest(link(link(last))$ 的位置单调递增。因此这个循环最多不会执行超过 $n$ 次迭代,这正是我们需要证明的。 @@ -277,11 +277,11 @@ void sa_extend(char c) { ### 状态数 -对于一个长度为 $n$ 的字符串 $s$ ,它的后缀自动机中的状态数**不会超过 $2n-1$ **(假设 $n\ge2$ )。 +对于一个长度为 $n$ 的字符串 $s$ ,它的后缀自动机中的状态数 **不会超过 $2n-1$ ** (假设 $n\ge2$ )。 对上述结论的证明就是算法本身,因为一开始自动机含有一个状态,第一次和第二次迭代中只会创建一个节点,剩余的 $n-2$ 步中每步会创建至多 $2$ 个状态。 -然而我们也能在**不知道这个算法**的情况下**展示**这个估计值。我们回忆一下状态数等于不同的 $endpos$ 集合个数。另外这些 $endpos$ 集合形成了一棵树(祖先节点的集合包含了它所有孩子节点的集合)。考虑将这棵树稍微变形一下:只要它有一个只有一个孩子的内部顶点(这意味着该子节点的集合至少遗漏了它的父集合中的一个位置),我们创建一个含有这个遗漏位置的集合。最后我们可以获得一棵每一个内部顶点的度数大于一的树,并且叶子节点的个数不超过 $n$ 。因此这样的树里有不超过 $2n-1$ 个节点。 +然而我们也能在 **不知道这个算法** 的情况下 **展示** 这个估计值。我们回忆一下状态数等于不同的 $endpos$ 集合个数。另外这些 $endpos$ 集合形成了一棵树(祖先节点的集合包含了它所有孩子节点的集合)。考虑将这棵树稍微变形一下:只要它有一个只有一个孩子的内部顶点(这意味着该子节点的集合至少遗漏了它的父集合中的一个位置),我们创建一个含有这个遗漏位置的集合。最后我们可以获得一棵每一个内部顶点的度数大于一的树,并且叶子节点的个数不超过 $n$ 。因此这样的树里有不超过 $2n-1$ 个节点。 对于每个确定的 $n$ ,状态数的上界是确定的。一个可能的字符串是: @@ -293,7 +293,7 @@ $$ ### 转移数 -对于一个长度为 $n$ 的字符串 $s$ ,它的后缀自动机中的转移数**不会超过 $3n-4$ **(假设 $n\ge 3$ )。 +对于一个长度为 $n$ 的字符串 $s$ ,它的后缀自动机中的转移数 **不会超过 $3n-4$ ** (假设 $n\ge 3$ )。 证明如下: @@ -401,7 +401,7 @@ $$ 接下来我们对每一个 $v$ 执行以下操作: $cnt[link(v)]+=cnt[v]$ 。其背后的含义是,如果有一个字符串 $v$ 出现了 $cnt[v]$ 次,那么它的所有后缀也在完全相同的地方结束,即也出现了 $cnt[v]$ 次。 -为什么我们在这个过程中不会重复计数(即把某些位置数了两次)呢?因为我们只将一个状态的位置添加到**一个**其它的状态上,所以一个状态不可能以两种不同的方式将其位置重复地指向另一个状态。 +为什么我们在这个过程中不会重复计数(即把某些位置数了两次)呢?因为我们只将一个状态的位置添加到 **一个** 其它的状态上,所以一个状态不可能以两种不同的方式将其位置重复地指向另一个状态。 因此,我们可以在 $O(length(T))$ 的时间内计算出所有状态的 $cnt$ 的值。 @@ -488,7 +488,7 @@ $$ 我们现在处理字符串 $T$ ,对于每一个前缀都在 $S$ 中寻找这个前缀的最长后缀。换句话说,对于每个字符串 $T$ 中的位置,我们想要找到这个位置结束的 $S$ 和 $T$ 的最长公共子串的长度。 -为了达到这一目的,我们使用两个变量,**当前状态** $v$ 和**当前长度** $l$ 。这两个变量描述当前匹配的部分:它的长度和它们对应的状态。 +为了达到这一目的,我们使用两个变量, **当前状态** $v$ 和 **当前长度** $l$ 。这两个变量描述当前匹配的部分:它的长度和它们对应的状态。 一开始 $v=t_0$ 且 $l=0$ ,即,匹配为空串。 @@ -560,20 +560,20 @@ $$ 我们先给出与后缀自动机有关的最初的一些文献: -- A. Blumer, J. Blumer, A. Ehrenfeucht, D. Haussler, R. McConnell.**Linear +- A. Blumer, J. Blumer, A. Ehrenfeucht, D. Haussler, R. McConnell. **Linear Size Finite Automata for the Set of All Subwords of a Word. An Outline of - Results**[1983] -- A. Blumer, J. Blumer, A. Ehrenfeucht, D. Haussler.**The Smallest Automaton - Recognizing the Subwords of a Text**[1984] -- Maxime Crochemore.**Optimal Factor Transducers**[1985] -- Maxime Crochemore.**Transducers and Repetitions**[1986] -- A. Nerode.**Linear automaton transformations**[1958] + Results** [1983] +- A. Blumer, J. Blumer, A. Ehrenfeucht, D. Haussler. **The Smallest Automaton + Recognizing the Subwords of a Text** [1984] +- Maxime Crochemore. **Optimal Factor Transducers** [1985] +- Maxime Crochemore. **Transducers and Repetitions** [1986] +- A. Nerode. **Linear automaton transformations** [1958] 另外,在更新的一些资源里,在很多关于字符串算法的书中,都能找到这个主题: -- Maxime Crochemore, Rytter Wowjcieh.**Jewels of Stringology**[2002] -- Bill Smyth.**Computing Patterns in Strings**[2003] -- Bill Smith.**Methods and algorithms of calculations on lines**[2006] +- Maxime Crochemore, Rytter Wowjcieh. **Jewels of Stringology** [2002] +- Bill Smyth. **Computing Patterns in Strings** [2003] +- Bill Smith. **Methods and algorithms of calculations on lines** [2006] 另外,还有一些资料: @@ -586,4 +586,4 @@ $$ * * * -**本页面主要译自博文[Суффиксный автомат](http://e-maxx.ru/algo/suffix_automata)与其英文翻译版[Suffix Automaton](https://cp-algorithms.com/string/suffix-automaton.html)。其中俄文版版权协议为 Public Domain + Leave a Link;英文版版权协议为 CC-BY-SA 4.0。** + **本页面主要译自博文[Суффиксный автомат](http://e-maxx.ru/algo/suffix_automata)与其英文翻译版[Suffix Automaton](https://cp-algorithms.com/string/suffix-automaton.html)。其中俄文版版权协议为 Public Domain + Leave a Link;英文版版权协议为 CC-BY-SA 4.0。** diff --git a/docs/string/z-function.md b/docs/string/z-function.md index 3e42d1cc..02f20a00 100644 --- a/docs/string/z-function.md +++ b/docs/string/z-function.md @@ -1,12 +1,12 @@ -假设我们有一个长度为 $n$ 的字符串 $s$ 。该字符串的**Z 函数**为一个长度为 $n$ 的数组,其中第 $i$ 个元素为满足从位置 $i$ 开始且为 $s$ 前缀的字符串的最大长度。 +假设我们有一个长度为 $n$ 的字符串 $s$ 。该字符串的 **Z 函数** 为一个长度为 $n$ 的数组,其中第 $i$ 个元素为满足从位置 $i$ 开始且为 $s$ 前缀的字符串的最大长度。 换句话说, $z[i]$ 是 $s$ 和从 $i$ 开始的 $s$ 的后缀的最大公共前缀长度。 -**注意**:为了避免歧义,在这篇文章中下标从 $0$ 开始,即 $s$ 的第一个字符下标为 $0$ ,最后一个字符下标为 $n - 1$ 。 + **注意** :为了避免歧义,在这篇文章中下标从 $0$ 开始,即 $s$ 的第一个字符下标为 $0$ ,最后一个字符下标为 $n - 1$ 。 Z 函数的第一个元素, $z[0]$ ,通常不是良定义的。在这篇文章中我们假定它是 $0$ (虽然在算法实现中这没有任何影响)。 -国外一般将计算该数组的算法称为**Z Algorithm**,而国内则称其为**扩展 KMP**。 +国外一般将计算该数组的算法称为 **Z Algorithm** ,而国内则称其为 **扩展 KMP** 。 这篇文章包含在 $O(n)$ 时间复杂度内计算 Z 函数的算法以及其各种应用。 @@ -40,15 +40,15 @@ vector z_function_trivial(string s) { 为了得到一个高效算法,我们将以 $i = 1$ 到 $n - 1$ 的顺序计算 $z[i]$ ,但在计算一个新值的同时,我们将尝试尽最大努力使用之前已经计算好的值。 -为了简便起见,定义**匹配段**为同 $s$ 一个前缀相同的那些子串。举例来说,所求 Z 函数的第 $i$ 个元素 $z[i]$ 为从位置 $i$ 开始的匹配段的长度(其终止位置位于 $i + z[i] - 1$ )。 +为了简便起见,定义 **匹配段** 为同 $s$ 一个前缀相同的那些子串。举例来说,所求 Z 函数的第 $i$ 个元素 $z[i]$ 为从位置 $i$ 开始的匹配段的长度(其终止位置位于 $i + z[i] - 1$ )。 -为了达成目标,我们将始终保持** $[l;r]$ 为最靠右的匹配段**。也就是说,在所有已探测到的匹配段中,我们将保持结尾最靠右的那一个。另一方面,下标 $r$ 可被认为是字符串 $s$ 已被算法扫描的边界;任何超过该点的字符都是未知的。 +为了达成目标,我们将始终保持 ** $[l;r]$ 为最靠右的匹配段** 。也就是说,在所有已探测到的匹配段中,我们将保持结尾最靠右的那一个。另一方面,下标 $r$ 可被认为是字符串 $s$ 已被算法扫描的边界;任何超过该点的字符都是未知的。 假设当前下标为 $i$ (即我们要计算的下一个 Z 函数值的下标),则有两种情况: -- $i > r$ -- 当前位置在我们已处理位置**之外**。 +- $i > r$ -- 当前位置在我们已处理位置 **之外** 。 - 我们接下来使用**朴素算法**(即一个一个的比较字符)来计算 $z[i]$ 。注意如果最后 $z[i] > 0$ ,我们需要更新最靠右的匹配段的下标,因为新的 $r = i + z[i] - 1$ 一定比之前的 $r$ 优。 + 我们接下来使用 **朴素算法** (即一个一个的比较字符)来计算 $z[i]$ 。注意如果最后 $z[i] > 0$ ,我们需要更新最靠右的匹配段的下标,因为新的 $r = i + z[i] - 1$ 一定比之前的 $r$ 优。 - $i \le r$ -- 当前位置位于当前匹配段 $[l;r]$ 之内。 @@ -58,7 +58,7 @@ vector z_function_trivial(string s) { 然而, $z[i - l]$ 可能太大了:将其应用到位置 $i$ 结果可能超过下标 $r$ 。这种做法并不合法,原因在于我们对 $r$ 右侧的字符一无所知:他们可能并不满足要求。 - 此处给出一个相似场景的**例子**: + 此处给出一个相似场景的 **例子** : $$ s=\mathtt{aaaabaa} @@ -72,9 +72,9 @@ vector z_function_trivial(string s) { z_0[i] = \min(r - i + 1, z[i - l]) $$ - 当将 $z[i]$ 初始化为 $z_0[i]$ 后,我们尝试使用**朴素算法**增加 $z[i]$ 的值 -- 因为宏观来讲,对于边界 $r$ 之后的事情,我们无法得知段是否会继续匹配还是失配。 + 当将 $z[i]$ 初始化为 $z_0[i]$ 后,我们尝试使用 **朴素算法** 增加 $z[i]$ 的值 -- 因为宏观来讲,对于边界 $r$ 之后的事情,我们无法得知段是否会继续匹配还是失配。 -综上所述,整个算法被划分成两种情况,他们只在设置 $z[i]$ 的**初始值**时有所不同:在第一种情况下,其被认为为 $0$ ,在第二种情况下它由先前已计算过的值确定(使用前述公式)。之后,该算法的两个分支都被规约为实现**朴素算法**。当我们设置完初始值后,该算法即开始执行。 +综上所述,整个算法被划分成两种情况,他们只在设置 $z[i]$ 的 **初始值** 时有所不同:在第一种情况下,其被认为为 $0$ ,在第二种情况下它由先前已计算过的值确定(使用前述公式)。之后,该算法的两个分支都被规约为实现 **朴素算法** 。当我们设置完初始值后,该算法即开始执行。 该算法看起来非常简单。尽管在每轮迭代都会运行朴素算法,但我们已经取得了巨大进步:获得了一个时间复杂度为线性的算法。之后我们会证明这一点。 @@ -115,7 +115,7 @@ vector z_function(string s) { 我们只关心内层 `while` 循环,因为其余部分在一次循环中只是一堆常数次操作,其时间复杂度总和为 $O(n)$ 。 -我们将证明 `while` 的**每次迭代**都将增加匹配段的右边界 $r$ 。 +我们将证明 `while` 的 **每次迭代** 都将增加匹配段的右边界 $r$ 。 为了做到这一点,我们将考虑算法的所有分支: @@ -157,7 +157,7 @@ vector z_function(string s) { ### 查找子串 -为了避免混淆,我们将 $t$ 称作**文本**,将 $p$ 称作**模式**。所给出的问题是:寻找在文本 $t$ 中模式 $p$ 的所有出现(occurrence)。 +为了避免混淆,我们将 $t$ 称作 **文本** ,将 $p$ 称作 **模式** 。所给出的问题是:寻找在文本 $t$ 中模式 $p$ 的所有出现(occurrence)。 为了解决该问题,我们构造一个新的字符串 $s = p + \diamond + t$ ,也即我们将 $p$ 和 $t$ 连接在一起,但是在中间放置了一个分割字符 $\diamond$ (我们将如此选取 $\diamond$ 使得其必定不出现在 $p$ 和 $t$ 中)。 @@ -201,4 +201,4 @@ vector z_function(string s) { * * * -**本页面主要译自博文[Z-функция строки и её вычисление](http://e-maxx.ru/algo/z_function)与其英文翻译版[Z-function and its calculation](https://cp-algorithms.com/string/z-function.html)。其中俄文版版权协议为 Public Domain + Leave a Link;英文版版权协议为 CC-BY-SA 4.0。** + **本页面主要译自博文[Z-функция строки и её вычисление](http://e-maxx.ru/algo/z_function)与其英文翻译版[Z-function and its calculation](https://cp-algorithms.com/string/z-function.html)。其中俄文版版权协议为 Public Domain + Leave a Link;英文版版权协议为 CC-BY-SA 4.0。** diff --git a/package-lock.json b/package-lock.json index ed31818c..bfe565ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", "requires": { - "acorn": "^5.0.0" + "acorn": "5.7.2" } }, "ajv": { @@ -32,10 +32,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "alphanum-sort": { @@ -48,7 +48,7 @@ "resolved": "http://registry.npm.taobao.org/ansi-colors/download/ansi-colors-1.1.0.tgz", "integrity": "sha1-Y3S03V1HGP884npnGjscrQdxMqk=", "requires": { - "ansi-wrap": "^0.1.0" + "ansi-wrap": "0.1.0" } }, "ansi-gray": { @@ -79,8 +79,8 @@ "resolved": "http://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "micromatch": "3.1.10", + "normalize-path": "2.1.1" } }, "append-buffer": { @@ -88,7 +88,7 @@ "resolved": "http://registry.npm.taobao.org/append-buffer/download/append-buffer-1.0.2.tgz", "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", "requires": { - "buffer-equal": "^1.0.0" + "buffer-equal": "1.0.0" } }, "archy": { @@ -101,7 +101,7 @@ "resolved": "http://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", "requires": { - "sprintf-js": "~1.0.2" + "sprintf-js": "1.0.3" } }, "arr-diff": { @@ -114,7 +114,7 @@ "resolved": "http://registry.npm.taobao.org/arr-filter/download/arr-filter-1.1.2.tgz", "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", "requires": { - "make-iterator": "^1.0.0" + "make-iterator": "1.0.1" } }, "arr-flatten": { @@ -127,7 +127,7 @@ "resolved": "http://registry.npm.taobao.org/arr-map/download/arr-map-2.0.2.tgz", "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", "requires": { - "make-iterator": "^1.0.0" + "make-iterator": "1.0.1" } }, "arr-union": { @@ -155,8 +155,8 @@ "resolved": "http://registry.npm.taobao.org/array-initial/download/array-initial-1.1.0.tgz", "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" + "array-slice": "1.1.0", + "is-number": "4.0.0" }, "dependencies": { "is-number": { @@ -171,7 +171,7 @@ "resolved": "http://registry.npm.taobao.org/array-last/download/array-last-1.3.0.tgz", "integrity": "sha1-eqdwc/7FZd2rJJP1+IGF9ASp0zY=", "requires": { - "is-number": "^4.0.0" + "is-number": "4.0.0" }, "dependencies": { "is-number": { @@ -191,9 +191,9 @@ "resolved": "http://registry.npm.taobao.org/array-sort/download/array-sort-1.0.0.tgz", "integrity": "sha1-5MBTVkU/VvU1EqfR1hI/LFTAqIo=", "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" + "default-compare": "1.0.0", + "get-value": "2.0.6", + "kind-of": "5.1.0" }, "dependencies": { "kind-of": { @@ -218,7 +218,7 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { - "safer-buffer": "~2.1.0" + "safer-buffer": "2.1.2" } }, "assert-plus": { @@ -241,10 +241,10 @@ "resolved": "http://registry.npm.taobao.org/async-done/download/async-done-1.3.1.tgz", "integrity": "sha1-FLe3Nme4ZMjwK1slP8nG7dt3fz4=", "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^1.0.7", - "stream-exhaust": "^1.0.1" + "end-of-stream": "1.4.1", + "once": "1.4.0", + "process-nextick-args": "1.0.7", + "stream-exhaust": "1.0.2" } }, "async-each": { @@ -262,7 +262,7 @@ "resolved": "http://registry.npm.taobao.org/async-settle/download/async-settle-1.0.0.tgz", "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", "requires": { - "async-done": "^1.2.2" + "async-done": "1.3.1" } }, "asynckit": { @@ -290,15 +290,15 @@ "resolved": "http://registry.npm.taobao.org/bach/download/bach-1.2.0.tgz", "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" + "arr-filter": "1.1.2", + "arr-flatten": "1.1.0", + "arr-map": "2.0.2", + "array-each": "1.0.1", + "array-initial": "1.1.0", + "array-last": "1.3.0", + "async-done": "1.3.1", + "async-settle": "1.0.0", + "now-and-later": "2.0.0" } }, "balanced-match": { @@ -311,13 +311,13 @@ "resolved": "http://registry.npm.taobao.org/base/download/base-0.11.2.tgz", "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" }, "dependencies": { "define-property": { @@ -325,7 +325,7 @@ "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -333,7 +333,7 @@ "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -341,7 +341,7 @@ "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -349,9 +349,9 @@ "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -362,7 +362,7 @@ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "optional": true, "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" } }, "beeper": { @@ -385,7 +385,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -394,16 +394,16 @@ "resolved": "http://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" }, "dependencies": { "extend-shallow": { @@ -411,7 +411,7 @@ "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -426,9 +426,9 @@ "resolved": "http://registry.npm.taobao.org/browserslist/download/browserslist-4.3.6.tgz", "integrity": "sha1-D52Qga/Gazb0d8a984E/eE9COWo=", "requires": { - "caniuse-lite": "^1.0.30000921", - "electron-to-chromium": "^1.3.92", - "node-releases": "^1.1.1" + "caniuse-lite": "1.0.30000923", + "electron-to-chromium": "1.3.96", + "node-releases": "1.1.2" } }, "buffer-equal": { @@ -451,15 +451,15 @@ "resolved": "http://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz", "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" } }, "caller-callsite": { @@ -467,7 +467,7 @@ "resolved": "http://registry.npm.taobao.org/caller-callsite/download/caller-callsite-2.0.0.tgz", "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "requires": { - "callsites": "^2.0.0" + "callsites": "2.0.0" } }, "caller-path": { @@ -475,7 +475,7 @@ "resolved": "http://registry.npm.taobao.org/caller-path/download/caller-path-2.0.0.tgz", "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "requires": { - "caller-callsite": "^2.0.0" + "caller-callsite": "2.0.0" } }, "callsites": { @@ -488,8 +488,8 @@ "resolved": "http://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz", "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "no-case": "2.3.2", + "upper-case": "1.1.3" } }, "camelcase": { @@ -502,10 +502,10 @@ "resolved": "http://registry.npm.taobao.org/caniuse-api/download/caniuse-api-3.0.0.tgz", "integrity": "sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA=", "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" + "browserslist": "4.3.6", + "caniuse-lite": "1.0.30000923", + "lodash.memoize": "4.1.2", + "lodash.uniq": "4.5.0" } }, "caniuse-lite": { @@ -523,11 +523,11 @@ "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" }, "dependencies": { "ansi-regex": { @@ -540,7 +540,7 @@ "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } } } @@ -550,19 +550,19 @@ "resolved": "http://registry.npm.taobao.org/chokidar/download/chokidar-2.0.4.tgz", "integrity": "sha1-NW/04rDo5D4yLRijckYLvPOszSY=", "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "fsevents": "1.2.4", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "lodash.debounce": "4.0.8", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.2.1", + "upath": "1.1.0" } }, "clang-format": { @@ -570,9 +570,9 @@ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.4.tgz", "integrity": "sha512-sw+nrGUp3hvmANd1qF8vZPuezSYQAiXgGBiEtkXTtJnnu6b00fCqkkDIsnRKrNgg4nv6NYZE92ejvOMIXZoejw==", "requires": { - "async": "^1.5.2", - "glob": "^7.0.0", - "resolve": "^1.1.6" + "async": "1.5.2", + "glob": "7.1.3", + "resolve": "1.8.1" } }, "class-utils": { @@ -580,10 +580,10 @@ "resolved": "http://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz", "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" }, "dependencies": { "define-property": { @@ -591,7 +591,7 @@ "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -601,7 +601,7 @@ "resolved": "http://registry.npm.taobao.org/clean-css/download/clean-css-4.2.1.tgz", "integrity": "sha1-LUEe92uFabbQyEBo2r6FsKpeXBc=", "requires": { - "source-map": "~0.6.0" + "source-map": "0.6.1" } }, "cliui": { @@ -609,9 +609,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" } }, "clone": { @@ -634,9 +634,9 @@ "resolved": "http://registry.npm.taobao.org/cloneable-readable/download/cloneable-readable-1.1.2.tgz", "integrity": "sha1-1ZHe5Kj4vBXaQ86X3O66E9Q+KmU=", "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" + "inherits": "2.0.3", + "process-nextick-args": "2.0.0", + "readable-stream": "2.3.6" }, "dependencies": { "process-nextick-args": { @@ -656,9 +656,9 @@ "resolved": "http://registry.npm.taobao.org/coa/download/coa-2.0.2.tgz", "integrity": "sha1-Q/bCEVG07yv1cYfbDXPeIp4+fsM=", "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" + "@types/q": "1.5.1", + "chalk": "2.4.1", + "q": "1.5.1" }, "dependencies": { "ansi-styles": { @@ -666,7 +666,7 @@ "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -674,9 +674,9 @@ "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.4.1.tgz", "integrity": "sha1-GMSasWoDe26wFSzIPjRxM4IVtm4=", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" } }, "supports-color": { @@ -684,7 +684,7 @@ "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -699,9 +699,9 @@ "resolved": "http://registry.npm.taobao.org/collection-map/download/collection-map-1.0.0.tgz", "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" + "arr-map": "2.0.2", + "for-own": "1.0.0", + "make-iterator": "1.0.1" } }, "collection-visit": { @@ -709,8 +709,8 @@ "resolved": "http://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "map-visit": "1.0.0", + "object-visit": "1.0.1" } }, "color": { @@ -718,8 +718,8 @@ "resolved": "http://registry.npm.taobao.org/color/download/color-3.1.0.tgz", "integrity": "sha1-2On7CWcyh1d0yEv5IoFd8DCND/w=", "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-convert": "1.9.3", + "color-string": "1.5.3" } }, "color-convert": { @@ -740,8 +740,8 @@ "resolved": "http://registry.npm.taobao.org/color-string/download/color-string-1.5.3.tgz", "integrity": "sha1-ybvF8BtYtUkvPWhXRZy2WQziBMw=", "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "color-name": "1.1.3", + "simple-swizzle": "0.2.2" } }, "color-support": { @@ -759,7 +759,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } }, "commander": { @@ -782,10 +782,10 @@ "resolved": "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz", "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "buffer-from": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" } }, "convert-source-map": { @@ -793,7 +793,7 @@ "resolved": "http://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.6.0.tgz", "integrity": "sha1-UbU3qMQ+DwTewZk7/83VBOdYrCA=", "requires": { - "safe-buffer": "~5.1.1" + "safe-buffer": "5.1.2" } }, "copy-descriptor": { @@ -806,8 +806,8 @@ "resolved": "http://registry.npm.taobao.org/copy-props/download/copy-props-2.0.4.tgz", "integrity": "sha1-k7scrfr9MdpbuKnUtB9HHsOnLf4=", "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" + "each-props": "1.3.2", + "is-plain-object": "2.0.4" } }, "copywriting-correct": { @@ -825,10 +825,10 @@ "resolved": "http://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-5.0.7.tgz", "integrity": "sha1-OYJrKS7g147aE336MXO9HCGkOwQ=", "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0" + "import-fresh": "2.0.0", + "is-directory": "0.3.1", + "js-yaml": "3.12.0", + "parse-json": "4.0.0" }, "dependencies": { "parse-json": { @@ -836,8 +836,8 @@ "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "error-ex": "1.3.2", + "json-parse-better-errors": "1.0.2" } } } @@ -847,9 +847,9 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.1" } }, "css": { @@ -857,10 +857,10 @@ "resolved": "http://registry.npm.taobao.org/css/download/css-2.2.4.tgz", "integrity": "sha1-xkZ1XHOXHyu6amAeLPL9cbEpiSk=", "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" + "inherits": "2.0.3", + "source-map": "0.6.1", + "source-map-resolve": "0.5.2", + "urix": "0.1.0" } }, "css-color-names": { @@ -873,8 +873,8 @@ "resolved": "http://registry.npm.taobao.org/css-declaration-sorter/download/css-declaration-sorter-4.0.1.tgz", "integrity": "sha1-wZiUD2OnbX42wecQGLABchBUyyI=", "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" + "postcss": "7.0.7", + "timsort": "0.3.0" } }, "css-select": { @@ -882,10 +882,10 @@ "resolved": "http://registry.npm.taobao.org/css-select/download/css-select-2.0.2.tgz", "integrity": "sha1-q0OGzsnh9miFVWSxfDcztDsqXt4=", "requires": { - "boolbase": "^1.0.0", - "css-what": "^2.1.2", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" + "boolbase": "1.0.0", + "css-what": "2.1.2", + "domutils": "1.7.0", + "nth-check": "1.0.2" } }, "css-select-base-adapter": { @@ -898,8 +898,8 @@ "resolved": "http://registry.npm.taobao.org/css-tree/download/css-tree-1.0.0-alpha.28.tgz", "integrity": "sha1-joloGQ2IbJR3vI1h6W9hrz9/+n8=", "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" + "mdn-data": "1.1.4", + "source-map": "0.5.7" }, "dependencies": { "source-map": { @@ -934,10 +934,10 @@ "resolved": "http://registry.npm.taobao.org/cssnano/download/cssnano-4.1.8.tgz", "integrity": "sha1-gBSYlnnV/UJJHkSZpSHb+4XJX9E=", "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.6", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" + "cosmiconfig": "5.0.7", + "cssnano-preset-default": "4.0.6", + "is-resolvable": "1.1.0", + "postcss": "7.0.7" } }, "cssnano-preset-default": { @@ -945,36 +945,36 @@ "resolved": "http://registry.npm.taobao.org/cssnano-preset-default/download/cssnano-preset-default-4.0.6.tgz", "integrity": "sha1-kjeeKm20qRwOpyf19VburGk+q2o=", "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.0", - "postcss-colormin": "^4.0.2", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.1", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.10", - "postcss-merge-rules": "^4.0.2", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.1", - "postcss-minify-params": "^4.0.1", - "postcss-minify-selectors": "^4.0.1", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.1", - "postcss-normalize-positions": "^4.0.1", - "postcss-normalize-repeat-style": "^4.0.1", - "postcss-normalize-string": "^4.0.1", - "postcss-normalize-timing-functions": "^4.0.1", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.1", - "postcss-ordered-values": "^4.1.1", - "postcss-reduce-initial": "^4.0.2", - "postcss-reduce-transforms": "^4.0.1", - "postcss-svgo": "^4.0.1", - "postcss-unique-selectors": "^4.0.1" + "css-declaration-sorter": "4.0.1", + "cssnano-util-raw-cache": "4.0.1", + "postcss": "7.0.7", + "postcss-calc": "7.0.1", + "postcss-colormin": "4.0.2", + "postcss-convert-values": "4.0.1", + "postcss-discard-comments": "4.0.1", + "postcss-discard-duplicates": "4.0.2", + "postcss-discard-empty": "4.0.1", + "postcss-discard-overridden": "4.0.1", + "postcss-merge-longhand": "4.0.10", + "postcss-merge-rules": "4.0.2", + "postcss-minify-font-values": "4.0.2", + "postcss-minify-gradients": "4.0.1", + "postcss-minify-params": "4.0.1", + "postcss-minify-selectors": "4.0.1", + "postcss-normalize-charset": "4.0.1", + "postcss-normalize-display-values": "4.0.1", + "postcss-normalize-positions": "4.0.1", + "postcss-normalize-repeat-style": "4.0.1", + "postcss-normalize-string": "4.0.1", + "postcss-normalize-timing-functions": "4.0.1", + "postcss-normalize-unicode": "4.0.1", + "postcss-normalize-url": "4.0.1", + "postcss-normalize-whitespace": "4.0.1", + "postcss-ordered-values": "4.1.1", + "postcss-reduce-initial": "4.0.2", + "postcss-reduce-transforms": "4.0.1", + "postcss-svgo": "4.0.1", + "postcss-unique-selectors": "4.0.1" } }, "cssnano-util-get-arguments": { @@ -992,7 +992,7 @@ "resolved": "http://registry.npm.taobao.org/cssnano-util-raw-cache/download/cssnano-util-raw-cache-4.0.1.tgz", "integrity": "sha1-sm1f1fcqEd/np4RvtMZyYPlr8oI=", "requires": { - "postcss": "^7.0.0" + "postcss": "7.0.7" } }, "cssnano-util-same-parent": { @@ -1013,8 +1013,8 @@ "resolved": "http://registry.npm.taobao.org/css-tree/download/css-tree-1.0.0-alpha.29.tgz", "integrity": "sha1-P6nU7zFCy9HDAedmTB81K9gvWjk=", "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" + "mdn-data": "1.1.4", + "source-map": "0.5.7" } }, "source-map": { @@ -1034,7 +1034,7 @@ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz", "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==", "requires": { - "cssom": "0.3.x" + "cssom": "0.3.4" } }, "d": { @@ -1042,7 +1042,7 @@ "resolved": "http://registry.npm.taobao.org/d/download/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "requires": { - "es5-ext": "^0.10.9" + "es5-ext": "0.10.46" } }, "dashdash": { @@ -1050,7 +1050,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "data-urls": { @@ -1058,9 +1058,9 @@ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.1.tgz", "integrity": "sha512-0HdcMZzK6ubMUnsMmQmG0AcLQPvbvb47R0+7CCZQCYgcd8OUWG91CG7sM6GoXgjz+WLl4ArFzHtBMy/QqSF4eg==", "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^7.0.0" + "abab": "2.0.0", + "whatwg-mimetype": "2.1.0", + "whatwg-url": "7.0.0" }, "dependencies": { "whatwg-url": { @@ -1068,9 +1068,9 @@ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "lodash.sortby": "4.7.0", + "tr46": "1.0.1", + "webidl-conversions": "4.0.2" } } } @@ -1108,7 +1108,7 @@ "resolved": "http://registry.npm.taobao.org/default-compare/download/default-compare-1.0.0.tgz", "integrity": "sha1-y2ETGESthNhHiPto/QFoHKd4Gi8=", "requires": { - "kind-of": "^5.0.2" + "kind-of": "5.1.0" }, "dependencies": { "kind-of": { @@ -1128,7 +1128,7 @@ "resolved": "http://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz", "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", "requires": { - "object-keys": "^1.0.12" + "object-keys": "1.0.12" } }, "define-property": { @@ -1136,8 +1136,8 @@ "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz", "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "is-descriptor": "1.0.2", + "isobject": "3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -1145,7 +1145,7 @@ "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -1153,7 +1153,7 @@ "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -1161,9 +1161,9 @@ "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -1183,8 +1183,8 @@ "resolved": "http://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" + "domelementtype": "1.1.3", + "entities": "1.1.2" }, "dependencies": { "domelementtype": { @@ -1204,7 +1204,7 @@ "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "requires": { - "webidl-conversions": "^4.0.2" + "webidl-conversions": "4.0.2" } }, "domutils": { @@ -1212,8 +1212,8 @@ "resolved": "http://registry.npm.taobao.org/domutils/download/domutils-1.7.0.tgz", "integrity": "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=", "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "0.1.0", + "domelementtype": "1.3.1" } }, "dot-prop": { @@ -1221,7 +1221,7 @@ "resolved": "http://registry.npm.taobao.org/dot-prop/download/dot-prop-4.2.0.tgz", "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", "requires": { - "is-obj": "^1.0.0" + "is-obj": "1.0.1" } }, "duplexer2": { @@ -1229,7 +1229,7 @@ "resolved": "http://registry.npm.taobao.org/duplexer2/download/duplexer2-0.0.2.tgz", "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", "requires": { - "readable-stream": "~1.1.9" + "readable-stream": "1.1.14" }, "dependencies": { "isarray": { @@ -1242,10 +1242,10 @@ "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "string_decoder": { @@ -1260,10 +1260,10 @@ "resolved": "http://registry.npm.taobao.org/duplexify/download/duplexify-3.6.1.tgz", "integrity": "sha1-saeinEq/1jlYXvrszoDWZrHjQSU=", "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" } }, "each-props": { @@ -1271,8 +1271,8 @@ "resolved": "http://registry.npm.taobao.org/each-props/download/each-props-1.3.2.tgz", "integrity": "sha1-6kWkFNFt1c+kGbGoFyDVygaJIzM=", "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0" } }, "ecc-jsbn": { @@ -1281,8 +1281,8 @@ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "optional": true, "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" } }, "electron-to-chromium": { @@ -1295,7 +1295,7 @@ "resolved": "http://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.1.tgz", "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", "requires": { - "once": "^1.4.0" + "once": "1.4.0" } }, "entities": { @@ -1308,7 +1308,7 @@ "resolved": "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz", "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", "requires": { - "is-arrayish": "^0.2.1" + "is-arrayish": "0.2.1" } }, "es-abstract": { @@ -1316,11 +1316,11 @@ "resolved": "http://registry.npm.taobao.org/es-abstract/download/es-abstract-1.12.0.tgz", "integrity": "sha1-nbvdJ8aFbwABQhyhh4LXhr+KYWU=", "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "es-to-primitive": "1.2.0", + "function-bind": "1.1.1", + "has": "1.0.3", + "is-callable": "1.1.4", + "is-regex": "1.0.4" } }, "es-to-primitive": { @@ -1328,9 +1328,9 @@ "resolved": "http://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.0.tgz", "integrity": "sha1-7fckeAM0VujdqO8J4ArZZQcH83c=", "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "1.1.4", + "is-date-object": "1.0.1", + "is-symbol": "1.0.2" } }, "es5-ext": { @@ -1338,9 +1338,9 @@ "resolved": "http://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.46.tgz", "integrity": "sha1-79mfZ8Wn7Hibqj2qf3mHA4j39XI=", "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" } }, "es6-iterator": { @@ -1348,9 +1348,9 @@ "resolved": "http://registry.npm.taobao.org/es6-iterator/download/es6-iterator-2.0.3.tgz", "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "d": "1.0.0", + "es5-ext": "0.10.46", + "es6-symbol": "3.1.1" } }, "es6-symbol": { @@ -1358,8 +1358,8 @@ "resolved": "http://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.1.tgz", "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "1.0.0", + "es5-ext": "0.10.46" } }, "es6-weak-map": { @@ -1367,10 +1367,10 @@ "resolved": "http://registry.npm.taobao.org/es6-weak-map/download/es6-weak-map-2.0.2.tgz", "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" + "d": "1.0.0", + "es5-ext": "0.10.46", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" } }, "escape-string-regexp": { @@ -1383,11 +1383,11 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" + "esprima": "3.1.3", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.6.1" } }, "esprima": { @@ -1410,13 +1410,13 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" } }, "expand-brackets": { @@ -1424,13 +1424,13 @@ "resolved": "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -1438,7 +1438,7 @@ "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -1446,7 +1446,7 @@ "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -1456,7 +1456,7 @@ "resolved": "http://registry.npm.taobao.org/expand-tilde/download/expand-tilde-2.0.2.tgz", "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "requires": { - "homedir-polyfill": "^1.0.1" + "homedir-polyfill": "1.0.1" } }, "extend": { @@ -1469,8 +1469,8 @@ "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -1478,7 +1478,7 @@ "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -1488,14 +1488,14 @@ "resolved": "http://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz", "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -1503,7 +1503,7 @@ "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -1511,7 +1511,7 @@ "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -1519,7 +1519,7 @@ "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -1527,7 +1527,7 @@ "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -1535,9 +1535,9 @@ "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -1552,10 +1552,10 @@ "resolved": "http://registry.npm.taobao.org/fancy-log/download/fancy-log-1.3.3.tgz", "integrity": "sha1-28GRVPVYaQFQojlToK29A1vkX8c=", "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" + "ansi-gray": "0.1.1", + "color-support": "1.1.3", + "parse-node-version": "1.0.0", + "time-stamp": "1.1.0" } }, "fast-deep-equal": { @@ -1578,10 +1578,10 @@ "resolved": "http://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" }, "dependencies": { "extend-shallow": { @@ -1589,7 +1589,7 @@ "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -1599,7 +1599,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "^2.0.0" + "locate-path": "2.0.0" } }, "findup-sync": { @@ -1607,10 +1607,10 @@ "resolved": "http://registry.npm.taobao.org/findup-sync/download/findup-sync-2.0.0.tgz", "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" + "detect-file": "1.0.0", + "is-glob": "3.1.0", + "micromatch": "3.1.10", + "resolve-dir": "1.0.1" }, "dependencies": { "is-glob": { @@ -1618,7 +1618,7 @@ "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "2.1.1" } } } @@ -1628,11 +1628,11 @@ "resolved": "http://registry.npm.taobao.org/fined/download/fined-1.1.1.tgz", "integrity": "sha1-ldiP8ykSPdGmlQ/fzTIfdGJx4B8=", "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" + "expand-tilde": "2.0.2", + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0", + "object.pick": "1.3.0", + "parse-filepath": "1.0.2" } }, "flagged-respawn": { @@ -1645,8 +1645,8 @@ "resolved": "http://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.0.3.tgz", "integrity": "sha1-xdWG7zivYJdlC0m8QbVfq7GfNb0=", "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "for-in": { @@ -1659,7 +1659,7 @@ "resolved": "http://registry.npm.taobao.org/for-own/download/for-own-1.0.0.tgz", "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "requires": { - "for-in": "^1.0.1" + "for-in": "1.0.2" } }, "forever-agent": { @@ -1672,9 +1672,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "^0.4.0", + "asynckit": "0.4.0", "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "mime-types": "2.1.20" } }, "fragment-cache": { @@ -1682,7 +1682,7 @@ "resolved": "http://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "requires": { - "map-cache": "^0.2.2" + "map-cache": "0.2.2" } }, "fs-mkdirp-stream": { @@ -1690,8 +1690,8 @@ "resolved": "http://registry.npm.taobao.org/fs-mkdirp-stream/download/fs-mkdirp-stream-1.0.0.tgz", "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" + "graceful-fs": "4.1.15", + "through2": "2.0.5" } }, "fs.realpath": { @@ -1705,8 +1705,8 @@ "integrity": "sha1-9B3LGvJYKvNpLaNvxVy9jhBBxCY=", "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "nan": "2.12.1", + "node-pre-gyp": "0.10.0" }, "dependencies": { "abbrev": { @@ -2186,7 +2186,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "glob": { @@ -2194,12 +2194,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "glob-parent": { @@ -2207,8 +2207,8 @@ "resolved": "http://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "is-glob": "3.1.0", + "path-dirname": "1.0.2" }, "dependencies": { "is-glob": { @@ -2216,7 +2216,7 @@ "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "2.1.1" } } } @@ -2226,16 +2226,16 @@ "resolved": "http://registry.npm.taobao.org/glob-stream/download/glob-stream-6.1.0.tgz", "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" + "extend": "3.0.2", + "glob": "7.1.3", + "glob-parent": "3.1.0", + "is-negated-glob": "1.0.0", + "ordered-read-streams": "1.0.1", + "pumpify": "1.5.1", + "readable-stream": "2.3.6", + "remove-trailing-separator": "1.1.0", + "to-absolute-glob": "2.0.2", + "unique-stream": "2.3.1" } }, "glob-watcher": { @@ -2243,12 +2243,12 @@ "resolved": "http://registry.npm.taobao.org/glob-watcher/download/glob-watcher-5.0.3.tgz", "integrity": "sha1-iKir8cTRMeuTkomUvEpZPC5d1iY=", "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "object.defaults": "^1.1.0" + "anymatch": "2.0.0", + "async-done": "1.3.1", + "chokidar": "2.0.4", + "is-negated-glob": "1.0.0", + "just-debounce": "1.0.0", + "object.defaults": "1.1.0" } }, "global-modules": { @@ -2256,9 +2256,9 @@ "resolved": "http://registry.npm.taobao.org/global-modules/download/global-modules-1.0.0.tgz", "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "global-prefix": "1.0.2", + "is-windows": "1.0.2", + "resolve-dir": "1.0.1" } }, "global-prefix": { @@ -2266,11 +2266,11 @@ "resolved": "http://registry.npm.taobao.org/global-prefix/download/global-prefix-1.0.2.tgz", "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "expand-tilde": "2.0.2", + "homedir-polyfill": "1.0.1", + "ini": "1.3.5", + "is-windows": "1.0.2", + "which": "1.3.1" } }, "glogg": { @@ -2278,7 +2278,7 @@ "resolved": "http://registry.npm.taobao.org/glogg/download/glogg-1.0.2.tgz", "integrity": "sha1-LX3XAr7aIus7/634gGltpthGMT8=", "requires": { - "sparkles": "^1.0.0" + "sparkles": "1.0.1" } }, "graceful-fs": { @@ -2291,10 +2291,10 @@ "resolved": "http://registry.npm.taobao.org/gulp/download/gulp-4.0.0.tgz", "integrity": "sha1-lXZsYB2t5Kd+0+eyttwDiBtZY2Y=", "requires": { - "glob-watcher": "^5.0.0", - "gulp-cli": "^2.0.0", - "undertaker": "^1.0.0", - "vinyl-fs": "^3.0.0" + "glob-watcher": "5.0.3", + "gulp-cli": "2.0.1", + "undertaker": "1.2.0", + "vinyl-fs": "3.0.3" }, "dependencies": { "ansi-regex": { @@ -2312,9 +2312,9 @@ "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" } }, "gulp-cli": { @@ -2322,24 +2322,24 @@ "resolved": "http://registry.npm.taobao.org/gulp-cli/download/gulp-cli-2.0.1.tgz", "integrity": "sha1-eEfiIMs2YvK+im1XK/FOF75amUs=", "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^2.5.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" + "ansi-colors": "1.1.0", + "archy": "1.0.0", + "array-sort": "1.0.0", + "color-support": "1.1.3", + "concat-stream": "1.6.2", + "copy-props": "2.0.4", + "fancy-log": "1.3.3", + "gulplog": "1.0.0", + "interpret": "1.1.0", + "isobject": "3.0.1", + "liftoff": "2.5.0", + "matchdep": "2.0.0", + "mute-stdout": "1.0.1", + "pretty-hrtime": "1.0.3", + "replace-homedir": "1.0.0", + "semver-greatest-satisfied-range": "1.1.0", + "v8flags": "3.1.2", + "yargs": "7.1.0" } }, "is-fullwidth-code-point": { @@ -2347,7 +2347,7 @@ "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "os-locale": { @@ -2355,7 +2355,7 @@ "resolved": "http://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { - "lcid": "^1.0.0" + "lcid": "1.0.0" } }, "string-width": { @@ -2363,9 +2363,9 @@ "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "strip-ansi": { @@ -2373,7 +2373,7 @@ "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "which-module": { @@ -2386,19 +2386,19 @@ "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-7.1.0.tgz", "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.3", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "5.0.0" } }, "yargs-parser": { @@ -2406,7 +2406,7 @@ "resolved": "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-5.0.0.tgz", "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", "requires": { - "camelcase": "^3.0.0" + "camelcase": "3.0.0" } } } @@ -2416,9 +2416,9 @@ "resolved": "http://registry.npm.taobao.org/gulp-htmlmin/download/gulp-htmlmin-5.0.1.tgz", "integrity": "sha1-kPxeitBCWp6G1dUhQnGE5ydjZec=", "requires": { - "html-minifier": "^3.5.20", - "plugin-error": "^1.0.1", - "through2": "^2.0.3" + "html-minifier": "3.5.21", + "plugin-error": "1.0.1", + "through2": "2.0.5" } }, "gulp-postcss": { @@ -2426,11 +2426,11 @@ "resolved": "http://registry.npm.taobao.org/gulp-postcss/download/gulp-postcss-8.0.0.tgz", "integrity": "sha1-jTdyzU0nvKVeyMtMjlduO95NxVA=", "requires": { - "fancy-log": "^1.3.2", - "plugin-error": "^1.0.1", - "postcss": "^7.0.2", - "postcss-load-config": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.1" + "fancy-log": "1.3.3", + "plugin-error": "1.0.1", + "postcss": "7.0.7", + "postcss-load-config": "2.0.0", + "vinyl-sourcemaps-apply": "0.2.1" } }, "gulp-purifycss": { @@ -2438,10 +2438,10 @@ "resolved": "http://registry.npm.taobao.org/gulp-purifycss/download/gulp-purifycss-0.2.0.tgz", "integrity": "sha1-GCxLrejsmXip+BNmPmkhr8GjUKM=", "requires": { - "glob": "^5.0.10", - "gulp-util": "^3.0.5", - "purify-css": "^1.0.8", - "through2": "^2.0.0" + "glob": "5.0.15", + "gulp-util": "3.0.8", + "purify-css": "1.2.5", + "through2": "2.0.5" }, "dependencies": { "glob": { @@ -2449,11 +2449,11 @@ "resolved": "http://registry.npm.taobao.org/glob/download/glob-5.0.15.tgz", "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } } } @@ -2463,24 +2463,24 @@ "resolved": "http://registry.npm.taobao.org/gulp-util/download/gulp-util-3.0.8.tgz", "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.2.0", + "fancy-log": "1.3.3", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" + "through2": "2.0.5", + "vinyl": "0.5.3" }, "dependencies": { "clone": { @@ -2503,8 +2503,8 @@ "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-0.5.3.tgz", "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", + "clone": "1.0.4", + "clone-stats": "0.0.1", "replace-ext": "0.0.1" } } @@ -2515,7 +2515,7 @@ "resolved": "http://registry.npm.taobao.org/gulplog/download/gulplog-1.0.0.tgz", "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", "requires": { - "glogg": "^1.0.0" + "glogg": "1.0.2" } }, "har-schema": { @@ -2528,8 +2528,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", "requires": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" + "ajv": "5.5.2", + "har-schema": "2.0.0" } }, "has": { @@ -2537,7 +2537,7 @@ "resolved": "http://registry.npm.taobao.org/has/download/has-1.0.3.tgz", "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", "requires": { - "function-bind": "^1.1.1" + "function-bind": "1.1.1" } }, "has-ansi": { @@ -2545,7 +2545,7 @@ "resolved": "http://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" }, "dependencies": { "ansi-regex": { @@ -2565,7 +2565,7 @@ "resolved": "http://registry.npm.taobao.org/has-gulplog/download/has-gulplog-0.1.0.tgz", "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", "requires": { - "sparkles": "^1.0.0" + "sparkles": "1.0.1" } }, "has-symbols": { @@ -2578,9 +2578,9 @@ "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" } }, "has-values": { @@ -2588,8 +2588,8 @@ "resolved": "http://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "is-number": "3.0.0", + "kind-of": "4.0.0" }, "dependencies": { "kind-of": { @@ -2597,7 +2597,7 @@ "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2617,7 +2617,7 @@ "resolved": "http://registry.npm.taobao.org/homedir-polyfill/download/homedir-polyfill-1.0.1.tgz", "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "requires": { - "parse-passwd": "^1.0.0" + "parse-passwd": "1.0.0" } }, "hosted-git-info": { @@ -2645,7 +2645,7 @@ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "requires": { - "whatwg-encoding": "^1.0.1" + "whatwg-encoding": "1.0.4" } }, "html-minifier": { @@ -2653,13 +2653,13 @@ "resolved": "http://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.21.tgz", "integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=", "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" + "camel-case": "3.0.0", + "clean-css": "4.2.1", + "commander": "2.17.1", + "he": "1.2.0", + "param-case": "2.1.1", + "relateurl": "0.2.7", + "uglify-js": "3.4.9" } }, "http-signature": { @@ -2667,9 +2667,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.2" } }, "iconv-lite": { @@ -2677,7 +2677,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": "2.1.2" } }, "import-cwd": { @@ -2685,7 +2685,7 @@ "resolved": "http://registry.npm.taobao.org/import-cwd/download/import-cwd-2.1.0.tgz", "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", "requires": { - "import-from": "^2.1.0" + "import-from": "2.1.0" } }, "import-fresh": { @@ -2693,8 +2693,8 @@ "resolved": "http://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz", "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "caller-path": "2.0.0", + "resolve-from": "3.0.0" } }, "import-from": { @@ -2702,7 +2702,7 @@ "resolved": "http://registry.npm.taobao.org/import-from/download/import-from-2.1.0.tgz", "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", "requires": { - "resolve-from": "^3.0.0" + "resolve-from": "3.0.0" } }, "indexes-of": { @@ -2715,8 +2715,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -2749,8 +2749,8 @@ "resolved": "http://registry.npm.taobao.org/is-absolute/download/is-absolute-1.0.0.tgz", "integrity": "sha1-OV4a6EsR8mrReV5zwXN45IowFXY=", "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" + "is-relative": "1.0.0", + "is-windows": "1.0.2" } }, "is-absolute-url": { @@ -2763,7 +2763,7 @@ "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -2771,7 +2771,7 @@ "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2786,7 +2786,7 @@ "resolved": "http://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "1.12.0" } }, "is-buffer": { @@ -2799,7 +2799,7 @@ "resolved": "http://registry.npm.taobao.org/is-builtin-module/download/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { - "builtin-modules": "^1.0.0" + "builtin-modules": "1.1.1" } }, "is-callable": { @@ -2812,12 +2812,12 @@ "resolved": "http://registry.npm.taobao.org/is-color-stop/download/is-color-stop-1.1.0.tgz", "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" + "css-color-names": "0.0.4", + "hex-color-regex": "1.1.0", + "hsl-regex": "1.0.0", + "hsla-regex": "1.0.0", + "rgb-regex": "1.0.1", + "rgba-regex": "1.0.0" } }, "is-data-descriptor": { @@ -2825,7 +2825,7 @@ "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -2833,7 +2833,7 @@ "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2848,9 +2848,9 @@ "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" }, "dependencies": { "kind-of": { @@ -2885,7 +2885,7 @@ "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-4.0.0.tgz", "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "requires": { - "is-extglob": "^2.1.1" + "is-extglob": "2.1.1" } }, "is-negated-glob": { @@ -2898,7 +2898,7 @@ "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -2906,7 +2906,7 @@ "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2921,7 +2921,7 @@ "resolved": "http://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz", "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" } }, "is-regex": { @@ -2929,7 +2929,7 @@ "resolved": "http://registry.npm.taobao.org/is-regex/download/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "requires": { - "has": "^1.0.1" + "has": "1.0.3" } }, "is-relative": { @@ -2937,7 +2937,7 @@ "resolved": "http://registry.npm.taobao.org/is-relative/download/is-relative-1.0.0.tgz", "integrity": "sha1-obtpNc6MXboei5dUubLcwCDiJg0=", "requires": { - "is-unc-path": "^1.0.0" + "is-unc-path": "1.0.0" } }, "is-resolvable": { @@ -2955,7 +2955,7 @@ "resolved": "http://registry.npm.taobao.org/is-svg/download/is-svg-3.0.0.tgz", "integrity": "sha1-kyHb0pwhLlypnE+peUxxS8r6L3U=", "requires": { - "html-comment-regex": "^1.1.0" + "html-comment-regex": "1.1.2" } }, "is-symbol": { @@ -2963,7 +2963,7 @@ "resolved": "http://registry.npm.taobao.org/is-symbol/download/is-symbol-1.0.2.tgz", "integrity": "sha1-oFX2rlcZLK7jKeeoYBGLSXqVDzg=", "requires": { - "has-symbols": "^1.0.0" + "has-symbols": "1.0.0" } }, "is-typedarray": { @@ -2976,7 +2976,7 @@ "resolved": "http://registry.npm.taobao.org/is-unc-path/download/is-unc-path-1.0.0.tgz", "integrity": "sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=", "requires": { - "unc-path-regex": "^0.1.2" + "unc-path-regex": "0.1.2" } }, "is-utf8": { @@ -3019,8 +3019,8 @@ "resolved": "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.12.0.tgz", "integrity": "sha1-6u1lbsg0TxD1J8a/obbiJE3hZ9E=", "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "1.0.10", + "esprima": "4.0.1" }, "dependencies": { "esprima": { @@ -3041,32 +3041,32 @@ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", + "abab": "2.0.0", + "acorn": "5.7.2", + "acorn-globals": "4.1.0", + "array-equal": "1.0.0", + "cssom": "0.3.4", + "cssstyle": "1.1.1", + "data-urls": "1.0.1", + "domexception": "1.0.1", + "escodegen": "1.11.0", + "html-encoding-sniffer": "1.0.2", + "left-pad": "1.3.0", + "nwsapi": "2.0.9", "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" + "pn": "1.1.0", + "request": "2.88.0", + "request-promise-native": "1.0.5", + "sax": "1.2.4", + "symbol-tree": "3.2.2", + "tough-cookie": "2.4.3", + "w3c-hr-time": "1.0.1", + "webidl-conversions": "4.0.2", + "whatwg-encoding": "1.0.4", + "whatwg-mimetype": "2.1.0", + "whatwg-url": "6.5.0", + "ws": "5.2.2", + "xml-name-validator": "3.0.0" } }, "json-parse-better-errors": { @@ -3120,8 +3120,8 @@ "resolved": "http://registry.npm.taobao.org/last-run/download/last-run-1.1.1.tgz", "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" + "default-resolution": "2.0.0", + "es6-weak-map": "2.0.2" } }, "lazystream": { @@ -3129,7 +3129,7 @@ "resolved": "http://registry.npm.taobao.org/lazystream/download/lazystream-1.0.0.tgz", "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", "requires": { - "readable-stream": "^2.0.5" + "readable-stream": "2.3.6" } }, "lcid": { @@ -3137,7 +3137,7 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "1.0.0" } }, "lead": { @@ -3145,7 +3145,7 @@ "resolved": "http://registry.npm.taobao.org/lead/download/lead-1.0.0.tgz", "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", "requires": { - "flush-write-stream": "^1.0.2" + "flush-write-stream": "1.0.3" } }, "left-pad": { @@ -3158,8 +3158,8 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "1.1.2", + "type-check": "0.3.2" } }, "liftoff": { @@ -3167,14 +3167,14 @@ "resolved": "http://registry.npm.taobao.org/liftoff/download/liftoff-2.5.0.tgz", "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", "requires": { - "extend": "^3.0.0", - "findup-sync": "^2.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" + "extend": "3.0.2", + "findup-sync": "2.0.0", + "fined": "1.1.1", + "flagged-respawn": "1.0.1", + "is-plain-object": "2.0.4", + "object.map": "1.0.1", + "rechoir": "0.6.2", + "resolve": "1.8.1" } }, "load-json-file": { @@ -3182,11 +3182,11 @@ "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "graceful-fs": "4.1.15", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" } }, "locate-path": { @@ -3194,8 +3194,8 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "2.0.0", + "path-exists": "3.0.0" } }, "lodash": { @@ -3258,7 +3258,7 @@ "resolved": "http://registry.npm.taobao.org/lodash.escape/download/lodash.escape-3.2.0.tgz", "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", "requires": { - "lodash._root": "^3.0.0" + "lodash._root": "3.0.1" } }, "lodash.isarguments": { @@ -3276,9 +3276,9 @@ "resolved": "http://registry.npm.taobao.org/lodash.keys/download/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" } }, "lodash.memoize": { @@ -3301,15 +3301,15 @@ "resolved": "http://registry.npm.taobao.org/lodash.template/download/lodash.template-3.6.2.tgz", "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" } }, "lodash.templatesettings": { @@ -3317,8 +3317,8 @@ "resolved": "http://registry.npm.taobao.org/lodash.templatesettings/download/lodash.templatesettings-3.1.1.tgz", "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" } }, "lodash.uniq": { @@ -3336,8 +3336,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "pseudomap": "1.0.2", + "yallist": "2.1.2" } }, "make-iterator": { @@ -3345,7 +3345,7 @@ "resolved": "http://registry.npm.taobao.org/make-iterator/download/make-iterator-1.0.1.tgz", "integrity": "sha1-KbM/MSqo9UfEpeSQ9Wr87JkTOtY=", "requires": { - "kind-of": "^6.0.2" + "kind-of": "6.0.2" } }, "map-cache": { @@ -3358,7 +3358,7 @@ "resolved": "http://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "requires": { - "object-visit": "^1.0.0" + "object-visit": "1.0.1" } }, "matchdep": { @@ -3366,9 +3366,9 @@ "resolved": "http://registry.npm.taobao.org/matchdep/download/matchdep-2.0.0.tgz", "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", + "findup-sync": "2.0.0", + "micromatch": "3.1.10", + "resolve": "1.8.1", "stack-trace": "0.0.10" } }, @@ -3382,9 +3382,9 @@ "resolved": "https://registry.npmjs.org/mathjax-node/-/mathjax-node-2.1.1.tgz", "integrity": "sha1-JcgPSU91QEGP/Pqcx1bf0hUCAb0=", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "jsdom": "^11.0.0", - "mathjax": "^2.7.2" + "is-fullwidth-code-point": "2.0.0", + "jsdom": "11.12.0", + "mathjax": "2.7.5" } }, "mathjax-node-page": { @@ -3392,8 +3392,8 @@ "resolved": "https://registry.npmjs.org/mathjax-node-page/-/mathjax-node-page-3.0.1.tgz", "integrity": "sha512-LlkChMBprwRqiNIhQ6eSuIG/FNt7HUzy0wkm2BD9/guGRLGvYxAmUC+cGbupmmqnuv0S1p0Un04BBoZAWdPqrQ==", "requires": { - "mathjax-node": "^2.0.0", - "yargs": "^11.0.0" + "mathjax-node": "2.1.1", + "yargs": "11.1.0" } }, "mdast-comment-marker": { @@ -3421,7 +3421,7 @@ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "1.2.0" } }, "micromatch": { @@ -3429,19 +3429,19 @@ "resolved": "http://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz", "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, "mime-db": { @@ -3454,7 +3454,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", "requires": { - "mime-db": "~1.36.0" + "mime-db": "1.36.0" } }, "mimic-fn": { @@ -3467,7 +3467,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -3480,8 +3480,8 @@ "resolved": "http://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.1.tgz", "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "for-in": "1.0.2", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -3489,7 +3489,7 @@ "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -3538,17 +3538,17 @@ "resolved": "http://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz", "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, "next-tick": { @@ -3561,7 +3561,7 @@ "resolved": "http://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz", "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", "requires": { - "lower-case": "^1.1.1" + "lower-case": "1.1.4" } }, "node-releases": { @@ -3569,7 +3569,7 @@ "resolved": "http://registry.npm.taobao.org/node-releases/download/node-releases-1.1.2.tgz", "integrity": "sha1-k8F/ul7shlCtkI3lQz+odjuuvk0=", "requires": { - "semver": "^5.3.0" + "semver": "5.6.0" } }, "normalize-package-data": { @@ -3577,10 +3577,10 @@ "resolved": "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.4.0.tgz", "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "2.7.1", + "is-builtin-module": "1.0.0", + "semver": "5.6.0", + "validate-npm-package-license": "3.0.4" } }, "normalize-path": { @@ -3588,7 +3588,7 @@ "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "requires": { - "remove-trailing-separator": "^1.0.1" + "remove-trailing-separator": "1.1.0" } }, "now-and-later": { @@ -3596,7 +3596,7 @@ "resolved": "http://registry.npm.taobao.org/now-and-later/download/now-and-later-2.0.0.tgz", "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", "requires": { - "once": "^1.3.2" + "once": "1.4.0" } }, "npm-run-path": { @@ -3604,7 +3604,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { - "path-key": "^2.0.0" + "path-key": "2.0.1" } }, "nth-check": { @@ -3612,7 +3612,7 @@ "resolved": "http://registry.npm.taobao.org/nth-check/download/nth-check-1.0.2.tgz", "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", "requires": { - "boolbase": "~1.0.0" + "boolbase": "1.0.0" } }, "number-is-nan": { @@ -3640,9 +3640,9 @@ "resolved": "http://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" }, "dependencies": { "define-property": { @@ -3650,7 +3650,7 @@ "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "kind-of": { @@ -3658,7 +3658,7 @@ "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -3673,7 +3673,7 @@ "resolved": "http://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "requires": { - "isobject": "^3.0.0" + "isobject": "3.0.1" } }, "object.assign": { @@ -3681,10 +3681,10 @@ "resolved": "http://registry.npm.taobao.org/object.assign/download/object.assign-4.1.0.tgz", "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "define-properties": "1.1.3", + "function-bind": "1.1.1", + "has-symbols": "1.0.0", + "object-keys": "1.0.12" } }, "object.defaults": { @@ -3692,10 +3692,10 @@ "resolved": "http://registry.npm.taobao.org/object.defaults/download/object.defaults-1.1.0.tgz", "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" + "array-each": "1.0.1", + "array-slice": "1.1.0", + "for-own": "1.0.0", + "isobject": "3.0.1" } }, "object.getownpropertydescriptors": { @@ -3703,8 +3703,8 @@ "resolved": "http://registry.npm.taobao.org/object.getownpropertydescriptors/download/object.getownpropertydescriptors-2.0.3.tgz", "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "define-properties": "1.1.3", + "es-abstract": "1.12.0" } }, "object.map": { @@ -3712,8 +3712,8 @@ "resolved": "http://registry.npm.taobao.org/object.map/download/object.map-1.0.1.tgz", "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" + "for-own": "1.0.0", + "make-iterator": "1.0.1" } }, "object.pick": { @@ -3721,7 +3721,7 @@ "resolved": "http://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" } }, "object.reduce": { @@ -3729,8 +3729,8 @@ "resolved": "http://registry.npm.taobao.org/object.reduce/download/object.reduce-1.0.1.tgz", "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" + "for-own": "1.0.0", + "make-iterator": "1.0.1" } }, "object.values": { @@ -3738,10 +3738,10 @@ "resolved": "http://registry.npm.taobao.org/object.values/download/object.values-1.0.4.tgz", "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" + "define-properties": "1.1.3", + "es-abstract": "1.12.0", + "function-bind": "1.1.1", + "has": "1.0.3" } }, "once": { @@ -3749,7 +3749,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "optionator": { @@ -3757,12 +3757,12 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" } }, "ordered-read-streams": { @@ -3770,7 +3770,7 @@ "resolved": "http://registry.npm.taobao.org/ordered-read-streams/download/ordered-read-streams-1.0.1.tgz", "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", "requires": { - "readable-stream": "^2.0.1" + "readable-stream": "2.3.6" } }, "os-locale": { @@ -3778,9 +3778,9 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" } }, "p-finally": { @@ -3793,7 +3793,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { - "p-try": "^1.0.0" + "p-try": "1.0.0" } }, "p-locate": { @@ -3801,7 +3801,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "^1.1.0" + "p-limit": "1.3.0" } }, "p-try": { @@ -3819,7 +3819,7 @@ "resolved": "http://registry.npm.taobao.org/param-case/download/param-case-2.1.1.tgz", "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "requires": { - "no-case": "^2.2.0" + "no-case": "2.3.2" } }, "parse-filepath": { @@ -3827,9 +3827,9 @@ "resolved": "http://registry.npm.taobao.org/parse-filepath/download/parse-filepath-1.0.2.tgz", "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" + "is-absolute": "1.0.0", + "map-cache": "0.2.2", + "path-root": "0.1.1" } }, "parse-json": { @@ -3837,7 +3837,7 @@ "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "requires": { - "error-ex": "^1.2.0" + "error-ex": "1.3.2" } }, "parse-node-version": { @@ -3890,7 +3890,7 @@ "resolved": "http://registry.npm.taobao.org/path-root/download/path-root-0.1.1.tgz", "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", "requires": { - "path-root-regex": "^0.1.0" + "path-root-regex": "0.1.2" } }, "path-root-regex": { @@ -3903,9 +3903,9 @@ "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "graceful-fs": "4.1.15", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "performance-now": { @@ -3928,7 +3928,7 @@ "resolved": "http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { - "pinkie": "^2.0.0" + "pinkie": "2.0.4" } }, "plugin-error": { @@ -3936,10 +3936,10 @@ "resolved": "http://registry.npm.taobao.org/plugin-error/download/plugin-error-1.0.1.tgz", "integrity": "sha1-dwFr2JGdCsN3/c3QMiMolTyleBw=", "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" + "ansi-colors": "1.1.0", + "arr-diff": "4.0.0", + "arr-union": "3.1.0", + "extend-shallow": "3.0.2" } }, "plur": { @@ -3947,7 +3947,7 @@ "resolved": "https://registry.npmjs.org/plur/-/plur-3.0.1.tgz", "integrity": "sha512-lJl0ojUynAM1BZn58Pas2WT/TXeC1+bS+UqShl0x9+49AtOn7DixRXVzaC8qrDOIxNDmepKnLuMTH7NQmkX0PA==", "requires": { - "irregular-plurals": "^2.0.0" + "irregular-plurals": "2.0.0" } }, "pn": { @@ -3965,9 +3965,9 @@ "resolved": "http://registry.npm.taobao.org/postcss/download/postcss-7.0.7.tgz", "integrity": "sha1-J1TQc/d6y07wjxI1w2xXIacgFhQ=", "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" + "chalk": "2.4.1", + "source-map": "0.6.1", + "supports-color": "5.5.0" }, "dependencies": { "ansi-styles": { @@ -3975,7 +3975,7 @@ "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -3983,9 +3983,9 @@ "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.4.1.tgz", "integrity": "sha1-GMSasWoDe26wFSzIPjRxM4IVtm4=", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" } }, "supports-color": { @@ -3993,7 +3993,7 @@ "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -4003,10 +4003,10 @@ "resolved": "http://registry.npm.taobao.org/postcss-calc/download/postcss-calc-7.0.1.tgz", "integrity": "sha1-Ntd7qwI7Dsu5eJ2E3LI8SUEUVDY=", "requires": { - "css-unit-converter": "^1.1.1", - "postcss": "^7.0.5", - "postcss-selector-parser": "^5.0.0-rc.4", - "postcss-value-parser": "^3.3.1" + "css-unit-converter": "1.1.1", + "postcss": "7.0.7", + "postcss-selector-parser": "5.0.0", + "postcss-value-parser": "3.3.1" } }, "postcss-colormin": { @@ -4014,11 +4014,11 @@ "resolved": "http://registry.npm.taobao.org/postcss-colormin/download/postcss-colormin-4.0.2.tgz", "integrity": "sha1-k80foRKAAIaWiH2xpSgEixjn7Zk=", "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "browserslist": "4.3.6", + "color": "3.1.0", + "has": "1.0.3", + "postcss": "7.0.7", + "postcss-value-parser": "3.3.1" } }, "postcss-convert-values": { @@ -4026,8 +4026,8 @@ "resolved": "http://registry.npm.taobao.org/postcss-convert-values/download/postcss-convert-values-4.0.1.tgz", "integrity": "sha1-yjgT7U2g+BL51DcDWE5Enr4Ymn8=", "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "postcss": "7.0.7", + "postcss-value-parser": "3.3.1" } }, "postcss-discard-comments": { @@ -4035,7 +4035,7 @@ "resolved": "http://registry.npm.taobao.org/postcss-discard-comments/download/postcss-discard-comments-4.0.1.tgz", "integrity": "sha1-MGl3NbDEdoUqehEFDrhDh6Z+9V0=", "requires": { - "postcss": "^7.0.0" + "postcss": "7.0.7" } }, "postcss-discard-duplicates": { @@ -4043,7 +4043,7 @@ "resolved": "http://registry.npm.taobao.org/postcss-discard-duplicates/download/postcss-discard-duplicates-4.0.2.tgz", "integrity": "sha1-P+EzzTyCKC5VD8myORdqkge3hOs=", "requires": { - "postcss": "^7.0.0" + "postcss": "7.0.7" } }, "postcss-discard-empty": { @@ -4051,7 +4051,7 @@ "resolved": "http://registry.npm.taobao.org/postcss-discard-empty/download/postcss-discard-empty-4.0.1.tgz", "integrity": "sha1-yMlR6fc+2UKAGUWERKAq2Qu592U=", "requires": { - "postcss": "^7.0.0" + "postcss": "7.0.7" } }, "postcss-discard-overridden": { @@ -4059,7 +4059,7 @@ "resolved": "http://registry.npm.taobao.org/postcss-discard-overridden/download/postcss-discard-overridden-4.0.1.tgz", "integrity": "sha1-ZSrvipZybwKfXj4AFG7npOdV/1c=", "requires": { - "postcss": "^7.0.0" + "postcss": "7.0.7" } }, "postcss-load-config": { @@ -4067,8 +4067,8 @@ "resolved": "http://registry.npm.taobao.org/postcss-load-config/download/postcss-load-config-2.0.0.tgz", "integrity": "sha1-8TEt2/WRLNdHF3CDxe96GdYu5IQ=", "requires": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" + "cosmiconfig": "4.0.0", + "import-cwd": "2.1.0" }, "dependencies": { "cosmiconfig": { @@ -4076,10 +4076,10 @@ "resolved": "http://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-4.0.0.tgz", "integrity": "sha1-dgORVJWAu9LfHlYrwXexPCkJctw=", "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" + "is-directory": "0.3.1", + "js-yaml": "3.12.0", + "parse-json": "4.0.0", + "require-from-string": "2.0.2" } }, "parse-json": { @@ -4087,8 +4087,8 @@ "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "error-ex": "1.3.2", + "json-parse-better-errors": "1.0.2" } } } @@ -4099,9 +4099,9 @@ "integrity": "sha1-xNY6tXvcBUq0BnqwddSIyMKXg4A=", "requires": { "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" + "postcss": "7.0.7", + "postcss-value-parser": "3.3.1", + "stylehacks": "4.0.1" } }, "postcss-merge-rules": { @@ -4109,12 +4109,12 @@ "resolved": "http://registry.npm.taobao.org/postcss-merge-rules/download/postcss-merge-rules-4.0.2.tgz", "integrity": "sha1-K+REAb8ZhW8n8yuLEsDfWvG4jnQ=", "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" + "browserslist": "4.3.6", + "caniuse-api": "3.0.0", + "cssnano-util-same-parent": "4.0.1", + "postcss": "7.0.7", + "postcss-selector-parser": "3.1.1", + "vendors": "1.0.2" }, "dependencies": { "postcss-selector-parser": { @@ -4122,9 +4122,9 @@ "resolved": "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.1.tgz", "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", "requires": { - "dot-prop": "^4.1.1", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "dot-prop": "4.2.0", + "indexes-of": "1.0.1", + "uniq": "1.0.1" } } } @@ -4134,8 +4134,8 @@ "resolved": "http://registry.npm.taobao.org/postcss-minify-font-values/download/postcss-minify-font-values-4.0.2.tgz", "integrity": "sha1-zUw0TM5HQ0P6xdgiBqssvLiv1aY=", "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "postcss": "7.0.7", + "postcss-value-parser": "3.3.1" } }, "postcss-minify-gradients": { @@ -4143,10 +4143,10 @@ "resolved": "http://registry.npm.taobao.org/postcss-minify-gradients/download/postcss-minify-gradients-4.0.1.tgz", "integrity": "sha1-balcbpKoCflWu3a/DARJSVPhp90=", "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "cssnano-util-get-arguments": "4.0.0", + "is-color-stop": "1.1.0", + "postcss": "7.0.7", + "postcss-value-parser": "3.3.1" } }, "postcss-minify-params": { @@ -4154,12 +4154,12 @@ "resolved": "http://registry.npm.taobao.org/postcss-minify-params/download/postcss-minify-params-4.0.1.tgz", "integrity": "sha1-Wy4tAmTdZF711o+P7A1MOMHPk9I=", "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" + "alphanum-sort": "1.0.2", + "browserslist": "4.3.6", + "cssnano-util-get-arguments": "4.0.0", + "postcss": "7.0.7", + "postcss-value-parser": "3.3.1", + "uniqs": "2.0.0" } }, "postcss-minify-selectors": { @@ -4167,10 +4167,10 @@ "resolved": "http://registry.npm.taobao.org/postcss-minify-selectors/download/postcss-minify-selectors-4.0.1.tgz", "integrity": "sha1-qJHBl5d8w3q/YLPqBrhCSLHB6c0=", "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" + "alphanum-sort": "1.0.2", + "has": "1.0.3", + "postcss": "7.0.7", + "postcss-selector-parser": "3.1.1" }, "dependencies": { "postcss-selector-parser": { @@ -4178,9 +4178,9 @@ "resolved": "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.1.tgz", "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", "requires": { - "dot-prop": "^4.1.1", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "dot-prop": "4.2.0", + "indexes-of": "1.0.1", + "uniq": "1.0.1" } } } @@ -4190,7 +4190,7 @@ "resolved": "http://registry.npm.taobao.org/postcss-normalize-charset/download/postcss-normalize-charset-4.0.1.tgz", "integrity": "sha1-izWt067oOhNrBHHg1ZvlilAoXdQ=", "requires": { - "postcss": "^7.0.0" + "postcss": "7.0.7" } }, "postcss-normalize-display-values": { @@ -4198,9 +4198,9 @@ "resolved": "http://registry.npm.taobao.org/postcss-normalize-display-values/download/postcss-normalize-display-values-4.0.1.tgz", "integrity": "sha1-2ag9R8cW6KmA8i9jLIsEWM+0ikw=", "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "cssnano-util-get-match": "4.0.0", + "postcss": "7.0.7", + "postcss-value-parser": "3.3.1" } }, "postcss-normalize-positions": { @@ -4208,10 +4208,10 @@ "resolved": "http://registry.npm.taobao.org/postcss-normalize-positions/download/postcss-normalize-positions-4.0.1.tgz", "integrity": "sha1-7i1LZ4GMlhlkxr4J0XmJS5T9a6E=", "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "cssnano-util-get-arguments": "4.0.0", + "has": "1.0.3", + "postcss": "7.0.7", + "postcss-value-parser": "3.3.1" } }, "postcss-normalize-repeat-style": { @@ -4219,10 +4219,10 @@ "resolved": "http://registry.npm.taobao.org/postcss-normalize-repeat-style/download/postcss-normalize-repeat-style-4.0.1.tgz", "integrity": "sha1-UpPyNLlNdmmp+AVJXTW4KlgcUOU=", "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "cssnano-util-get-arguments": "4.0.0", + "cssnano-util-get-match": "4.0.0", + "postcss": "7.0.7", + "postcss-value-parser": "3.3.1" } }, "postcss-normalize-string": { @@ -4230,9 +4230,9 @@ "resolved": "http://registry.npm.taobao.org/postcss-normalize-string/download/postcss-normalize-string-4.0.1.tgz", "integrity": "sha1-I8UDDCzCQXX2bJFPpRmeLjwQ/vM=", "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "has": "1.0.3", + "postcss": "7.0.7", + "postcss-value-parser": "3.3.1" } }, "postcss-normalize-timing-functions": { @@ -4240,9 +4240,9 @@ "resolved": "http://registry.npm.taobao.org/postcss-normalize-timing-functions/download/postcss-normalize-timing-functions-4.0.1.tgz", "integrity": "sha1-i+g+C5yz/y0avd7gMqSRCPBfldc=", "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "cssnano-util-get-match": "4.0.0", + "postcss": "7.0.7", + "postcss-value-parser": "3.3.1" } }, "postcss-normalize-unicode": { @@ -4250,9 +4250,9 @@ "resolved": "http://registry.npm.taobao.org/postcss-normalize-unicode/download/postcss-normalize-unicode-4.0.1.tgz", "integrity": "sha1-hBvUj9zzAZrUuqdJOj02O1KuHPs=", "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "browserslist": "4.3.6", + "postcss": "7.0.7", + "postcss-value-parser": "3.3.1" } }, "postcss-normalize-url": { @@ -4260,10 +4260,10 @@ "resolved": "http://registry.npm.taobao.org/postcss-normalize-url/download/postcss-normalize-url-4.0.1.tgz", "integrity": "sha1-EOQ3+GvHx+WPe5ZS7YeNqqlfquE=", "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "is-absolute-url": "2.1.0", + "normalize-url": "3.3.0", + "postcss": "7.0.7", + "postcss-value-parser": "3.3.1" }, "dependencies": { "normalize-url": { @@ -4278,8 +4278,8 @@ "resolved": "http://registry.npm.taobao.org/postcss-normalize-whitespace/download/postcss-normalize-whitespace-4.0.1.tgz", "integrity": "sha1-0Uy2ObYSOEGKyLyNO3vdZfyGV14=", "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "postcss": "7.0.7", + "postcss-value-parser": "3.3.1" } }, "postcss-ordered-values": { @@ -4287,9 +4287,9 @@ "resolved": "http://registry.npm.taobao.org/postcss-ordered-values/download/postcss-ordered-values-4.1.1.tgz", "integrity": "sha1-LjtDLvPkibGDM67KHxKV64m+n8I=", "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "cssnano-util-get-arguments": "4.0.0", + "postcss": "7.0.7", + "postcss-value-parser": "3.3.1" } }, "postcss-reduce-initial": { @@ -4297,10 +4297,10 @@ "resolved": "http://registry.npm.taobao.org/postcss-reduce-initial/download/postcss-reduce-initial-4.0.2.tgz", "integrity": "sha1-usjjJdZ1EO4B+kYGdtyOqeO0DxU=", "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" + "browserslist": "4.3.6", + "caniuse-api": "3.0.0", + "has": "1.0.3", + "postcss": "7.0.7" } }, "postcss-reduce-transforms": { @@ -4308,10 +4308,10 @@ "resolved": "http://registry.npm.taobao.org/postcss-reduce-transforms/download/postcss-reduce-transforms-4.0.1.tgz", "integrity": "sha1-hgDVVTvdOtZA9Dv/getS+HYNRWE=", "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "cssnano-util-get-match": "4.0.0", + "has": "1.0.3", + "postcss": "7.0.7", + "postcss-value-parser": "3.3.1" } }, "postcss-selector-parser": { @@ -4319,9 +4319,9 @@ "resolved": "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-5.0.0.tgz", "integrity": "sha1-JJBENWaXsztk8aj3yAki3d7nGVw=", "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "cssesc": "2.0.0", + "indexes-of": "1.0.1", + "uniq": "1.0.1" } }, "postcss-svgo": { @@ -4329,10 +4329,10 @@ "resolved": "http://registry.npm.taobao.org/postcss-svgo/download/postcss-svgo-4.0.1.tgz", "integrity": "sha1-VijNs48BXea1iM5tC/ByS0krWB0=", "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" + "is-svg": "3.0.0", + "postcss": "7.0.7", + "postcss-value-parser": "3.3.1", + "svgo": "1.1.1" } }, "postcss-unique-selectors": { @@ -4340,9 +4340,9 @@ "resolved": "http://registry.npm.taobao.org/postcss-unique-selectors/download/postcss-unique-selectors-4.0.1.tgz", "integrity": "sha1-lEaRHzKJv9ZMbWgPBzwDsfnuS6w=", "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" + "alphanum-sort": "1.0.2", + "postcss": "7.0.7", + "uniqs": "2.0.0" } }, "postcss-value-parser": { @@ -4380,8 +4380,8 @@ "resolved": "http://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz", "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "end-of-stream": "1.4.1", + "once": "1.4.0" } }, "pumpify": { @@ -4389,9 +4389,9 @@ "resolved": "http://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz", "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "duplexify": "3.6.1", + "inherits": "2.0.3", + "pump": "2.0.1" } }, "punycode": { @@ -4404,11 +4404,11 @@ "resolved": "http://registry.npm.taobao.org/purify-css/download/purify-css-1.2.5.tgz", "integrity": "sha1-xLnskHNXZfPiR7pqO0nxMvNIJQA=", "requires": { - "clean-css": "^4.0.12", - "glob": "^7.1.1", - "rework": "^1.0.1", - "uglify-js": "^3.0.6", - "yargs": "^8.0.1" + "clean-css": "4.2.1", + "glob": "7.1.3", + "rework": "1.0.1", + "uglify-js": "3.4.9", + "yargs": "8.0.2" }, "dependencies": { "ansi-regex": { @@ -4421,9 +4421,9 @@ "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" }, "dependencies": { "string-width": { @@ -4431,9 +4431,9 @@ "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } } } @@ -4443,7 +4443,7 @@ "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "load-json-file": { @@ -4451,10 +4451,10 @@ "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" + "graceful-fs": "4.1.15", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" } }, "path-type": { @@ -4462,7 +4462,7 @@ "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-2.0.0.tgz", "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "requires": { - "pify": "^2.0.0" + "pify": "2.3.0" } }, "read-pkg": { @@ -4470,9 +4470,9 @@ "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-2.0.0.tgz", "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" } }, "read-pkg-up": { @@ -4480,8 +4480,8 @@ "resolved": "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "find-up": "2.1.0", + "read-pkg": "2.0.0" } }, "strip-ansi": { @@ -4489,7 +4489,7 @@ "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-bom": { @@ -4502,19 +4502,19 @@ "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-8.0.2.tgz", "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.3", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" } }, "yargs-parser": { @@ -4522,7 +4522,7 @@ "resolved": "http://registry.npm.taobao.org/yargs-parser/download/yargs-parser-7.0.0.tgz", "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" } } } @@ -4542,9 +4542,9 @@ "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" } }, "read-pkg-up": { @@ -4552,8 +4552,8 @@ "resolved": "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "1.1.2", + "read-pkg": "1.1.0" }, "dependencies": { "find-up": { @@ -4561,8 +4561,8 @@ "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "path-exists": { @@ -4570,7 +4570,7 @@ "resolved": "http://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "^2.0.0" + "pinkie-promise": "2.0.1" } } } @@ -4580,13 +4580,13 @@ "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" }, "dependencies": { "process-nextick-args": { @@ -4601,9 +4601,9 @@ "resolved": "http://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz", "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "graceful-fs": "4.1.15", + "micromatch": "3.1.10", + "readable-stream": "2.3.6" } }, "rechoir": { @@ -4611,7 +4611,7 @@ "resolved": "http://registry.npm.taobao.org/rechoir/download/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "requires": { - "resolve": "^1.1.6" + "resolve": "1.8.1" } }, "regex-not": { @@ -4619,8 +4619,8 @@ "resolved": "http://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz", "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" } }, "relateurl": { @@ -4633,8 +4633,8 @@ "resolved": "https://registry.npmjs.org/remark-clang-format/-/remark-clang-format-1.0.1.tgz", "integrity": "sha512-ztyv9OPExH/TDSSaYJPIwsVbL2yGqSASyZtEcXIOg5O7kwAiJH4jSUhZ6OgUCfrGv/R/kzKscP5FP8VBIDwAtQ==", "requires": { - "clang-format": "^1.2.4", - "unist-util-visit": "^1.4.0" + "clang-format": "1.2.4", + "unist-util-visit": "1.4.0" } }, "remark-copywriting-correct": { @@ -4642,9 +4642,9 @@ "resolved": "https://registry.npmjs.org/remark-copywriting-correct/-/remark-copywriting-correct-0.4.0.tgz", "integrity": "sha512-E0iLgS5qCr4Xw1qelQUwwDTGo7I+5OQPgpRTrrtr0eivde3yxQaPAPFvkwYXQaMRqUyLiSo6efHeku8aX6pA7g==", "requires": { - "copywriting-correct": "^1.0.2", - "unist-util-is": "^2.1.1", - "unist-util-visit": "^1.1.3" + "copywriting-correct": "1.0.5", + "unist-util-is": "2.1.2", + "unist-util-visit": "1.4.0" } }, "remark-lint": { @@ -4652,7 +4652,7 @@ "resolved": "https://registry.npmjs.org/remark-lint/-/remark-lint-6.0.2.tgz", "integrity": "sha512-zrIx7InZLLOUYUViT6lSa8T80pDyl3Ywvliog+4hoc7LoiJZRV74ejq+RBZK70bg/p2dU/CV6ycedgypFFePPg==", "requires": { - "remark-message-control": "^4.0.0" + "remark-message-control": "4.1.0" } }, "remark-lint-blockquote-indentation": { @@ -4660,12 +4660,12 @@ "resolved": "https://registry.npmjs.org/remark-lint-blockquote-indentation/-/remark-lint-blockquote-indentation-1.0.2.tgz", "integrity": "sha512-u3ruA+4ZZOpt3YmTCdCOcYiGBMSQ/b/iJvZs/fibF6rwSBmkod48aGGJVoOLMuIuTYYbbXpzigxS+PeJwN0CDQ==", "requires": { - "mdast-util-to-string": "^1.0.2", - "plur": "^3.0.0", - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "mdast-util-to-string": "1.0.5", + "plur": "3.0.1", + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-code-block-style": { @@ -4673,10 +4673,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-code-block-style/-/remark-lint-code-block-style-1.0.2.tgz", "integrity": "sha512-fTSCga/lJ710zBaD808NwqzAatVoLQFizvXWpetygKwoAfXCyMYQ9DUdDE5jdDhwOu2JPnKbxY+4t6m4SrKKWA==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-definition-case": { @@ -4684,10 +4684,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-definition-case/-/remark-lint-definition-case-1.0.2.tgz", "integrity": "sha512-vzL3IufsgYMdoYzgelryjBbNotMSac2VpIQWPbBrOEaMO8YA0OwFmD4ZxZ/IgqExRJs7CYO1v7Vr1/AhIy6RwA==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-definition-spacing": { @@ -4695,10 +4695,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-definition-spacing/-/remark-lint-definition-spacing-1.0.2.tgz", "integrity": "sha512-Yg1BcI/nydXii1B6kiqKIBsqDW7KlOCBMpJO2jMGmNuEuZe8sv1AWNmaCtiSCdPuDiX0CZRidklrkrZwAthPdw==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-emphasis-marker": { @@ -4706,10 +4706,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-emphasis-marker/-/remark-lint-emphasis-marker-1.0.2.tgz", "integrity": "sha512-c+uvvnYesMaqy/X0dU62dbI6/rk+4dxMXdnfLC/NKBA8GU+4kljWqluW797S6nBG94QZjKIv8m49zJl38QfImQ==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-fenced-code-flag": { @@ -4717,10 +4717,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-fenced-code-flag/-/remark-lint-fenced-code-flag-1.0.2.tgz", "integrity": "sha512-6/412zYtz+qKpFJryEPSMurWr6tO5MTVohJF3byFc3+3SSEZLWY3Dg8gbwFlumZ9T4HgmfUm/LT7Idm96zj0nw==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-fenced-code-marker": { @@ -4728,10 +4728,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-fenced-code-marker/-/remark-lint-fenced-code-marker-1.0.2.tgz", "integrity": "sha512-yAP59Q1JoI1jjOFCn0GoNx4uDji99ROLvdwvmz7+9YR9guDArBcR4i9Wem/wN6apauWPk2DbAZFavHvbZaT8HQ==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-file-extension": { @@ -4739,7 +4739,7 @@ "resolved": "https://registry.npmjs.org/remark-lint-file-extension/-/remark-lint-file-extension-1.0.2.tgz", "integrity": "sha512-qx0uki74rmALIKE3r5J3neasbXnz6h+l88OngvpwWkELsnJmfk81JdxfEd0tZ++uTj6CN0TZuhMKad9smfNtRw==", "requires": { - "unified-lint-rule": "^1.0.0" + "unified-lint-rule": "1.0.3" } }, "remark-lint-final-definition": { @@ -4747,10 +4747,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-final-definition/-/remark-lint-final-definition-1.0.2.tgz", "integrity": "sha512-F+n8eauYOJGdcSrnD7w2YgQSERx1rAwXTxStaJ2tLmoXlT7eQgpVGHz1U4Y76cg8OANbq8pT0KTNJ85JNqkq4g==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-final-newline": { @@ -4758,7 +4758,7 @@ "resolved": "https://registry.npmjs.org/remark-lint-final-newline/-/remark-lint-final-newline-1.0.2.tgz", "integrity": "sha512-hW/lbDwVKtME3jIcJWJ16wBtoJdFPWIiu0fEI93yzNTjeB1g3VSWJp66dHbtCLYwquRS5fr8UlGx7JxIu1kiuA==", "requires": { - "unified-lint-rule": "^1.0.0" + "unified-lint-rule": "1.0.3" } }, "remark-lint-hard-break-spaces": { @@ -4766,10 +4766,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-hard-break-spaces/-/remark-lint-hard-break-spaces-1.0.3.tgz", "integrity": "sha512-GiC0uXeFwef6/Pfo+EYBN0WIVlEFffh+9TdeJ4uLt89ZweaRVDPCTJQqkkuXoiXSPnZGD7cGHdkWCfXU1PaU7Q==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-heading-increment": { @@ -4777,9 +4777,9 @@ "resolved": "https://registry.npmjs.org/remark-lint-heading-increment/-/remark-lint-heading-increment-1.0.2.tgz", "integrity": "sha512-CE3MmARKFk6LK+nBuOUubhr64LnbJfLNx1gA8XgxWJ4s/gf8yZO23KsaWk3ftVmmwk0d8Eqh4qKg8vvvaMyrWQ==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-visit": "1.4.0" } }, "remark-lint-heading-style": { @@ -4787,10 +4787,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-heading-style/-/remark-lint-heading-style-1.0.2.tgz", "integrity": "sha512-d0aIbL8PU5LWfZVI8p49vEV5wWIfD/DdUjc+O8j5E0UWUgcRgPGB66xznkOb8AiniXpcaYggRW8hGZsxoYNt1g==", "requires": { - "mdast-util-heading-style": "^1.0.2", - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-visit": "^1.1.1" + "mdast-util-heading-style": "1.0.4", + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-visit": "1.4.0" } }, "remark-lint-link-title-style": { @@ -4798,11 +4798,11 @@ "resolved": "https://registry.npmjs.org/remark-lint-link-title-style/-/remark-lint-link-title-style-1.0.2.tgz", "integrity": "sha512-0yoaSeLek5hWAQM8WETpi7/pY8kAVOOC/G1ZZFKmIQ0LPeWIzbIlPKJVV0vCiW97J3Bpv8PL0TMTwhXeP0KH2w==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1", - "vfile-location": "^2.0.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0", + "vfile-location": "2.0.3" } }, "remark-lint-list-item-content-indent": { @@ -4810,11 +4810,11 @@ "resolved": "https://registry.npmjs.org/remark-lint-list-item-content-indent/-/remark-lint-list-item-content-indent-1.0.2.tgz", "integrity": "sha512-I7VkspA/jeMmIWZ4cGmW/4oWnT6fP8pn5n11MR7azRMKgooj3N2qGF084UqrWHh/dLJcakJUNl3NTXv1XCS1Mw==", "requires": { - "plur": "^3.0.0", - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "plur": "3.0.1", + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-list-item-indent": { @@ -4822,11 +4822,11 @@ "resolved": "https://registry.npmjs.org/remark-lint-list-item-indent/-/remark-lint-list-item-indent-1.0.2.tgz", "integrity": "sha512-ogCCrO8nyuM/0k1bo+O7Ww0S08XxHA9sHh5VdhLwffCTCyOPDoxL1zWCIrAgzPBFZkgjXDQHsOxeUBi5I1ZFcA==", "requires": { - "plur": "^3.0.0", - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "plur": "3.0.1", + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-list-item-spacing": { @@ -4834,10 +4834,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-list-item-spacing/-/remark-lint-list-item-spacing-1.1.2.tgz", "integrity": "sha512-IhG28ofW85o/2+eVH1ft1zgQmjxqDhNp3+217EQLQviPt/+jVcMsua4W4ZQECPg0E9473yiY9TKbBodp2kOMkg==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-maximum-heading-length": { @@ -4845,10 +4845,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-maximum-heading-length/-/remark-lint-maximum-heading-length-1.0.2.tgz", "integrity": "sha512-kDdwgRItpVGhxdUC+kbWn5YisCrtF4KggP8z36z26tBmDuPj1ohjQvfMWY0oKL8I0Y6UuXyE0vQx3m4R8Qrj+A==", "requires": { - "mdast-util-to-string": "^1.0.2", - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-visit": "^1.1.1" + "mdast-util-to-string": "1.0.5", + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-visit": "1.4.0" } }, "remark-lint-maximum-line-length": { @@ -4856,10 +4856,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-maximum-line-length/-/remark-lint-maximum-line-length-1.1.0.tgz", "integrity": "sha512-L+jI6+DReoxHyAWRIxABjX8hPDgxB8B5Lzp0/nDYjWbjl7I4vTsdEvejpmP1K8LVvZ7Ew0XcVHd1zt+p2O8tDg==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-no-auto-link-without-protocol": { @@ -4867,11 +4867,11 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-auto-link-without-protocol/-/remark-lint-no-auto-link-without-protocol-1.0.2.tgz", "integrity": "sha512-3GtkSxOyd6we4b8JdtJsNgt8+3UN+hpw1UiMoE9X96ahc1rqsCFm6miorNUnF/gfPQ1liHBvZUed2SIenDmpkg==", "requires": { - "mdast-util-to-string": "^1.0.2", - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "mdast-util-to-string": "1.0.5", + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-no-blockquote-without-marker": { @@ -4879,11 +4879,11 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-blockquote-without-marker/-/remark-lint-no-blockquote-without-marker-2.0.2.tgz", "integrity": "sha512-jkfZ4hFiviZttEo7Ac7GZWFgMQ/bdVPfSluLeuf+qwL8sQvR4ClklKJ0Xbkk3cLRjvlGsc8U8uZR8qqH5MSLoA==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1", - "vfile-location": "^2.0.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0", + "vfile-location": "2.0.3" } }, "remark-lint-no-consecutive-blank-lines": { @@ -4891,11 +4891,11 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-consecutive-blank-lines/-/remark-lint-no-consecutive-blank-lines-1.0.2.tgz", "integrity": "sha512-KbOm6EX5Yl9uzRC93soTB+HlqtCzu9XJWsV9CVcoDKtNnpKfyTwQOy6dmUbQrLp4xBdNk4s9S9CsemRaHEkFGA==", "requires": { - "plur": "^3.0.0", - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "plur": "3.0.1", + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-no-duplicate-headings": { @@ -4903,12 +4903,12 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-duplicate-headings/-/remark-lint-no-duplicate-headings-1.0.2.tgz", "integrity": "sha512-RO3/eQxLjUoHirHIVC+bE5Abzl+gWiJcdPr48gGSP34xfwCeaBAaeorOAxY/hOqOQ/EVNTTA/JHCBVSNPZWIeg==", "requires": { - "mdast-util-to-string": "^1.0.2", - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-stringify-position": "^1.1.2", - "unist-util-visit": "^1.1.1" + "mdast-util-to-string": "1.0.5", + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-stringify-position": "1.1.2", + "unist-util-visit": "1.4.0" } }, "remark-lint-no-emphasis-as-heading": { @@ -4916,9 +4916,9 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-emphasis-as-heading/-/remark-lint-no-emphasis-as-heading-1.0.2.tgz", "integrity": "sha512-lKlwiRQOFOoPSwjbZf065RaUr6RZmO82zZYjXhVT9xwMkWXIAQyG0GJuLB2/+rlMEtlgoUD3ePch+Pzf+KrSJQ==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-visit": "1.4.0" } }, "remark-lint-no-file-name-articles": { @@ -4926,7 +4926,7 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-file-name-articles/-/remark-lint-no-file-name-articles-1.0.2.tgz", "integrity": "sha512-5FuxJ0Hd2AgVSP1javG51qPbMBWxma1LrCKI6JmBsu/GM7ZYOgemMyH5v4I1ejTPGj7P30xmIjMNSnV8IBMq3g==", "requires": { - "unified-lint-rule": "^1.0.0" + "unified-lint-rule": "1.0.3" } }, "remark-lint-no-file-name-consecutive-dashes": { @@ -4934,7 +4934,7 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-file-name-consecutive-dashes/-/remark-lint-no-file-name-consecutive-dashes-1.0.2.tgz", "integrity": "sha512-VvCxG3AfRm6ROFNJ8+tdOOkk61mEKj+PytB8xg5WNQypKWhhJ734mJ3GzXD4XEov7Bdd1GVXJFXlLFtfoAewHw==", "requires": { - "unified-lint-rule": "^1.0.0" + "unified-lint-rule": "1.0.3" } }, "remark-lint-no-file-name-irregular-characters": { @@ -4942,7 +4942,7 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-file-name-irregular-characters/-/remark-lint-no-file-name-irregular-characters-1.0.2.tgz", "integrity": "sha512-8A+DYXsiPBu0q4cvqtYwzRj6SWrKnPh+oI1H1t64pCQiSnLmG9e3mAUXMxH9PiM6y5OW7Vw8Xh4KYsnRwGEuMQ==", "requires": { - "unified-lint-rule": "^1.0.0" + "unified-lint-rule": "1.0.3" } }, "remark-lint-no-file-name-mixed-case": { @@ -4950,7 +4950,7 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-file-name-mixed-case/-/remark-lint-no-file-name-mixed-case-1.0.2.tgz", "integrity": "sha512-OMH2kpjvDAsyyw8ar9h6WI1kUXSpQ2r2c5JZv3NBNYxwzTBfhCR2MSQq+eEI7yUmD2ehqNUY5LwZTQZG6cK4vw==", "requires": { - "unified-lint-rule": "^1.0.0" + "unified-lint-rule": "1.0.3" } }, "remark-lint-no-file-name-outer-dashes": { @@ -4958,7 +4958,7 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-file-name-outer-dashes/-/remark-lint-no-file-name-outer-dashes-1.0.3.tgz", "integrity": "sha512-imUWm8Bi9PxV+IQtQC2/BV1Yj0VboC9hPMZh3sae8pZvCjXquTyYiSFa7hQxX6KWCNUiRPHMSlaSVvfvM2e4pQ==", "requires": { - "unified-lint-rule": "^1.0.0" + "unified-lint-rule": "1.0.3" } }, "remark-lint-no-heading-punctuation": { @@ -4966,10 +4966,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-heading-punctuation/-/remark-lint-no-heading-punctuation-1.0.2.tgz", "integrity": "sha512-nYc2a0ihQ5cPy7elaM0lRPYKEMpEK6EjyJH6pHYlgG8NQwjKXhsVaek0fmAm12PaYoYOGW1pDxfzxnFUocU20g==", "requires": { - "mdast-util-to-string": "^1.0.2", - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-visit": "^1.1.1" + "mdast-util-to-string": "1.0.5", + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-visit": "1.4.0" } }, "remark-lint-no-inline-padding": { @@ -4977,10 +4977,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-inline-padding/-/remark-lint-no-inline-padding-1.0.2.tgz", "integrity": "sha512-SHYqEH27yxzgcXSyaIzvqImvktDhXGltRSOEhAHiL2nJktuPt3nosFfGy4/oKAJMWJ2N3aMudXq/zuw1dAkQSg==", "requires": { - "mdast-util-to-string": "^1.0.2", - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-visit": "^1.1.1" + "mdast-util-to-string": "1.0.5", + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-visit": "1.4.0" } }, "remark-lint-no-literal-urls": { @@ -4988,11 +4988,11 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-literal-urls/-/remark-lint-no-literal-urls-1.0.2.tgz", "integrity": "sha512-+mWZIJA4yAqpKIclcFP5wRy/6hxcPnfU9Xmgp4fR7OD4JQ4JHkKq9O7MUbda14PLez1aMX+Is0O0hWI7OuqsSw==", "requires": { - "mdast-util-to-string": "^1.0.2", - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "mdast-util-to-string": "1.0.5", + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-no-multiple-toplevel-headings": { @@ -5000,11 +5000,11 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-multiple-toplevel-headings/-/remark-lint-no-multiple-toplevel-headings-1.0.2.tgz", "integrity": "sha512-Zxkw7wIyMOyYQb5C5NTswSttZPCLqm/60Wnt0TEWzXVDkVk5DrxrCCxbMKgpXve1Co5CXPmMixNr/xYBqzxzWg==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-stringify-position": "^1.1.2", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-stringify-position": "1.1.2", + "unist-util-visit": "1.4.0" } }, "remark-lint-no-shell-dollars": { @@ -5012,9 +5012,9 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-shell-dollars/-/remark-lint-no-shell-dollars-1.0.2.tgz", "integrity": "sha512-eIjBebX9iOFWbMdjol5JJBXI7ku+7UyJpNrd++rl8QenLLZ76beh+xONCzJw/k5dhEw5voBmQLh7VK9HPU/ang==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-visit": "1.4.0" } }, "remark-lint-no-shortcut-reference-image": { @@ -5022,9 +5022,9 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-shortcut-reference-image/-/remark-lint-no-shortcut-reference-image-1.0.2.tgz", "integrity": "sha512-IVYv5pgyf70jYcrn+BNHVO37BuQJg26rFOLzi2mj+/8EdFpolJiJcTvkChJgz5yip7317DmQQSNLX6gCExuDrQ==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-visit": "1.4.0" } }, "remark-lint-no-shortcut-reference-link": { @@ -5032,9 +5032,9 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-shortcut-reference-link/-/remark-lint-no-shortcut-reference-link-1.0.3.tgz", "integrity": "sha512-v5mk4wYQL+YRmlOTqi8avpzhoGZg+P42dDRda2jedysDIx7TJBEXUH6oMFEbo/qV6PMmtr7fr066M3RrOrLpiQ==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-visit": "1.4.0" } }, "remark-lint-no-table-indentation": { @@ -5042,10 +5042,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-table-indentation/-/remark-lint-no-table-indentation-1.0.2.tgz", "integrity": "sha512-wH0lMGV3DGf7WeDLYGle7SODkXNKqmFtGuh6sG5oa0XgA17rI/L35Vq5tal4DE/5gQG+l4+/0Iy9FPKdBODSDA==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-no-tabs": { @@ -5053,8 +5053,8 @@ "resolved": "https://registry.npmjs.org/remark-lint-no-tabs/-/remark-lint-no-tabs-1.0.2.tgz", "integrity": "sha512-jPjRLHyzO4lO6orhOmHd6AN6mVc/uMWvYZ3qD41dniktnLyHEbIG6DpPxixjfpmEe0wi73RXMywKHrWshLJwAg==", "requires": { - "unified-lint-rule": "^1.0.0", - "vfile-location": "^2.0.1" + "unified-lint-rule": "1.0.3", + "vfile-location": "2.0.3" } }, "remark-lint-ordered-list-marker-style": { @@ -5062,10 +5062,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-ordered-list-marker-style/-/remark-lint-ordered-list-marker-style-1.0.2.tgz", "integrity": "sha512-4EHuHxZqy8IT4k+4Vc8P38I34AiZfgl07fS5/iqGhCdoSMCvvxdOuzTWTgpDFbx/W2QpHelBfJ+FtOp+E0J4Lg==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-ordered-list-marker-value": { @@ -5073,10 +5073,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-ordered-list-marker-value/-/remark-lint-ordered-list-marker-value-1.0.2.tgz", "integrity": "sha512-vIPD07u+FBjTjEETZ+UWUp2nydzvOe5AHIX812JlNXWuHYuCybq8DGnkYUcoiK3HbIE+KdG+e7C5xHkim0PSjw==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-rule-style": { @@ -5084,10 +5084,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-rule-style/-/remark-lint-rule-style-1.0.2.tgz", "integrity": "sha512-D9mMPKA7rtCe4Yx+ryip6FyfNG9uGOaHxRgJClfte7D66QzxiiWtHYyNCXI4rkv8Ax9PrEdpWCPcIl3D2LrXhw==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-strong-marker": { @@ -5095,10 +5095,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-strong-marker/-/remark-lint-strong-marker-1.0.2.tgz", "integrity": "sha512-oUSKqYJVLgbXe25NmcTOfQ8wsFasc+qhEoGjPEGPuJMV2aZIGuOEbGVqD5B1ckYGBEwbTuet3btvMohz8HaBDQ==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-table-cell-padding": { @@ -5106,10 +5106,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-table-cell-padding/-/remark-lint-table-cell-padding-1.0.2.tgz", "integrity": "sha512-uYm8ia0joAFeK0XLpxVtGW37Ry1XRBDmWH1gDiO2MXWcUip1w1Brvyue4H8JfXB4IM+S5eI/zPR5zN5Wpj9kfA==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-table-pipe-alignment": { @@ -5117,10 +5117,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-table-pipe-alignment/-/remark-lint-table-pipe-alignment-1.0.2.tgz", "integrity": "sha512-gLJwduvBI2soR7Dyf39KGUl3M9ZCK/7pFfWBeOv8J27D7px/1lXooqlX4Y9NQ/+9jc7DyLF9upPxh7UWm7UXGg==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-table-pipes": { @@ -5128,10 +5128,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-table-pipes/-/remark-lint-table-pipes-1.0.2.tgz", "integrity": "sha512-BGKcOviuUC6fILIOPYFe6awqk57ApzNJpK3OYBrweGoFF55nZ/qf3q6JpzA0chd6wKj7VrcfQEd3QSQQ+8Wcrw==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-lint-unordered-list-marker-style": { @@ -5139,10 +5139,10 @@ "resolved": "https://registry.npmjs.org/remark-lint-unordered-list-marker-style/-/remark-lint-unordered-list-marker-style-1.0.2.tgz", "integrity": "sha512-qdnF9JuMWzFJzGIfdAWfOHyjad8dqIQSs+cTzqMlNZHOGrrCJdTUWzybzcZMGn1yuwreklZdHKhOglXQFwSD3A==", "requires": { - "unified-lint-rule": "^1.0.0", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.1" + "unified-lint-rule": "1.0.3", + "unist-util-generated": "1.1.2", + "unist-util-position": "3.0.1", + "unist-util-visit": "1.4.0" } }, "remark-math": { @@ -5150,7 +5150,7 @@ "resolved": "http://registry.npm.taobao.org/remark-math/download/remark-math-1.0.5.tgz", "integrity": "sha1-EQpuf3zTXSR5Vkbe+hjS2Y8lE5s=", "requires": { - "trim-trailing-lines": "^1.1.0" + "trim-trailing-lines": "1.1.1" } }, "remark-math-space": { @@ -5163,9 +5163,9 @@ "resolved": "https://registry.npmjs.org/remark-message-control/-/remark-message-control-4.1.0.tgz", "integrity": "sha512-e1dszks4YKY7hLAkhS2367jBjBpAfvi+kVgSN/tOFrdp3qxITjiNR5fOFnyYF8vvorkQ9uxlKJoZUOW8T7rKDg==", "requires": { - "mdast-comment-marker": "^1.0.0", - "unified-message-control": "^1.0.0", - "xtend": "^4.0.1" + "mdast-comment-marker": "1.0.3", + "unified-message-control": "1.0.4", + "xtend": "4.0.1" } }, "remark-pangu": { @@ -5173,9 +5173,9 @@ "resolved": "https://registry.npmjs.org/remark-pangu/-/remark-pangu-1.0.1.tgz", "integrity": "sha1-t4QksIP3AlR2Ks6lMyIKYmZNAcM=", "requires": { - "pangu": "^3.3.0", - "unist-util-is": "^2.1.1", - "unist-util-visit": "^1.1.3" + "pangu": "3.3.0", + "unist-util-is": "2.1.2", + "unist-util-visit": "1.4.0" } }, "remark-preset-lint-markdown-style-guide": { @@ -5183,51 +5183,51 @@ "resolved": "https://registry.npmjs.org/remark-preset-lint-markdown-style-guide/-/remark-preset-lint-markdown-style-guide-2.1.2.tgz", "integrity": "sha512-0mYeeO084o3ZuDSQCvj5vpMZEGQ/HxPcO5vdNpicu+wKpuGNKV2hYZeHbXa/uZV0gjiQeuRmCHIDgNaDsMj5fg==", "requires": { - "remark-lint": "^6.0.0", - "remark-lint-blockquote-indentation": "^1.0.0", - "remark-lint-code-block-style": "^1.0.0", - "remark-lint-definition-case": "^1.0.0", - "remark-lint-definition-spacing": "^1.0.0", - "remark-lint-emphasis-marker": "^1.0.0", - "remark-lint-fenced-code-flag": "^1.0.0", - "remark-lint-fenced-code-marker": "^1.0.0", - "remark-lint-file-extension": "^1.0.0", - "remark-lint-final-definition": "^1.0.0", - "remark-lint-hard-break-spaces": "^1.0.0", - "remark-lint-heading-increment": "^1.0.0", - "remark-lint-heading-style": "^1.0.0", - "remark-lint-link-title-style": "^1.0.0", - "remark-lint-list-item-content-indent": "^1.0.0", - "remark-lint-list-item-indent": "^1.0.0", - "remark-lint-list-item-spacing": "^1.0.0", - "remark-lint-maximum-heading-length": "^1.0.0", - "remark-lint-maximum-line-length": "^1.0.0", - "remark-lint-no-auto-link-without-protocol": "^1.0.0", - "remark-lint-no-blockquote-without-marker": "^2.0.0", - "remark-lint-no-consecutive-blank-lines": "^1.0.0", - "remark-lint-no-duplicate-headings": "^1.0.0", - "remark-lint-no-emphasis-as-heading": "^1.0.0", - "remark-lint-no-file-name-articles": "^1.0.0", - "remark-lint-no-file-name-consecutive-dashes": "^1.0.0", - "remark-lint-no-file-name-irregular-characters": "^1.0.0", - "remark-lint-no-file-name-mixed-case": "^1.0.0", - "remark-lint-no-file-name-outer-dashes": "^1.0.0", - "remark-lint-no-heading-punctuation": "^1.0.0", - "remark-lint-no-inline-padding": "^1.0.0", - "remark-lint-no-literal-urls": "^1.0.0", - "remark-lint-no-multiple-toplevel-headings": "^1.0.0", - "remark-lint-no-shell-dollars": "^1.0.0", - "remark-lint-no-shortcut-reference-image": "^1.0.0", - "remark-lint-no-shortcut-reference-link": "^1.0.0", - "remark-lint-no-table-indentation": "^1.0.0", - "remark-lint-ordered-list-marker-style": "^1.0.0", - "remark-lint-ordered-list-marker-value": "^1.0.0", - "remark-lint-rule-style": "^1.0.0", - "remark-lint-strong-marker": "^1.0.0", - "remark-lint-table-cell-padding": "^1.0.0", - "remark-lint-table-pipe-alignment": "^1.0.0", - "remark-lint-table-pipes": "^1.0.0", - "remark-lint-unordered-list-marker-style": "^1.0.0" + "remark-lint": "6.0.2", + "remark-lint-blockquote-indentation": "1.0.2", + "remark-lint-code-block-style": "1.0.2", + "remark-lint-definition-case": "1.0.2", + "remark-lint-definition-spacing": "1.0.2", + "remark-lint-emphasis-marker": "1.0.2", + "remark-lint-fenced-code-flag": "1.0.2", + "remark-lint-fenced-code-marker": "1.0.2", + "remark-lint-file-extension": "1.0.2", + "remark-lint-final-definition": "1.0.2", + "remark-lint-hard-break-spaces": "1.0.3", + "remark-lint-heading-increment": "1.0.2", + "remark-lint-heading-style": "1.0.2", + "remark-lint-link-title-style": "1.0.2", + "remark-lint-list-item-content-indent": "1.0.2", + "remark-lint-list-item-indent": "1.0.2", + "remark-lint-list-item-spacing": "1.1.2", + "remark-lint-maximum-heading-length": "1.0.2", + "remark-lint-maximum-line-length": "1.1.0", + "remark-lint-no-auto-link-without-protocol": "1.0.2", + "remark-lint-no-blockquote-without-marker": "2.0.2", + "remark-lint-no-consecutive-blank-lines": "1.0.2", + "remark-lint-no-duplicate-headings": "1.0.2", + "remark-lint-no-emphasis-as-heading": "1.0.2", + "remark-lint-no-file-name-articles": "1.0.2", + "remark-lint-no-file-name-consecutive-dashes": "1.0.2", + "remark-lint-no-file-name-irregular-characters": "1.0.2", + "remark-lint-no-file-name-mixed-case": "1.0.2", + "remark-lint-no-file-name-outer-dashes": "1.0.3", + "remark-lint-no-heading-punctuation": "1.0.2", + "remark-lint-no-inline-padding": "1.0.2", + "remark-lint-no-literal-urls": "1.0.2", + "remark-lint-no-multiple-toplevel-headings": "1.0.2", + "remark-lint-no-shell-dollars": "1.0.2", + "remark-lint-no-shortcut-reference-image": "1.0.2", + "remark-lint-no-shortcut-reference-link": "1.0.3", + "remark-lint-no-table-indentation": "1.0.2", + "remark-lint-ordered-list-marker-style": "1.0.2", + "remark-lint-ordered-list-marker-value": "1.0.2", + "remark-lint-rule-style": "1.0.2", + "remark-lint-strong-marker": "1.0.2", + "remark-lint-table-cell-padding": "1.0.2", + "remark-lint-table-pipe-alignment": "1.0.2", + "remark-lint-table-pipes": "1.0.2", + "remark-lint-unordered-list-marker-style": "1.0.2" } }, "remove-bom-buffer": { @@ -5235,8 +5235,8 @@ "resolved": "http://registry.npm.taobao.org/remove-bom-buffer/download/remove-bom-buffer-3.0.0.tgz", "integrity": "sha1-wr8eN3Ug0yT2I4kuM8EMrCwlK1M=", "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" + "is-buffer": "1.1.6", + "is-utf8": "0.2.1" } }, "remove-bom-stream": { @@ -5244,9 +5244,9 @@ "resolved": "http://registry.npm.taobao.org/remove-bom-stream/download/remove-bom-stream-1.2.0.tgz", "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" + "remove-bom-buffer": "3.0.0", + "safe-buffer": "5.1.2", + "through2": "2.0.5" } }, "remove-trailing-separator": { @@ -5274,9 +5274,9 @@ "resolved": "http://registry.npm.taobao.org/replace-homedir/download/replace-homedir-1.0.0.tgz", "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" + "homedir-polyfill": "1.0.1", + "is-absolute": "1.0.0", + "remove-trailing-separator": "1.1.0" } }, "request": { @@ -5284,26 +5284,26 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "aws-sign2": "0.7.0", + "aws4": "1.8.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.1.0", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.20", + "oauth-sign": "0.9.0", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.4.3", + "tunnel-agent": "0.6.0", + "uuid": "3.3.2" } }, "request-promise-core": { @@ -5311,7 +5311,7 @@ "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", "requires": { - "lodash": "^4.13.1" + "lodash": "4.17.10" } }, "request-promise-native": { @@ -5320,8 +5320,8 @@ "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", "requires": { "request-promise-core": "1.1.1", - "stealthy-require": "^1.1.0", - "tough-cookie": ">=2.3.3" + "stealthy-require": "1.1.1", + "tough-cookie": "2.4.3" } }, "require-directory": { @@ -5344,7 +5344,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", "requires": { - "path-parse": "^1.0.5" + "path-parse": "1.0.6" } }, "resolve-dir": { @@ -5352,8 +5352,8 @@ "resolved": "http://registry.npm.taobao.org/resolve-dir/download/resolve-dir-1.0.1.tgz", "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "expand-tilde": "2.0.2", + "global-modules": "1.0.0" } }, "resolve-from": { @@ -5366,7 +5366,7 @@ "resolved": "http://registry.npm.taobao.org/resolve-options/download/resolve-options-1.1.0.tgz", "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", "requires": { - "value-or-function": "^3.0.0" + "value-or-function": "3.0.0" } }, "resolve-url": { @@ -5384,8 +5384,8 @@ "resolved": "http://registry.npm.taobao.org/rework/download/rework-1.0.1.tgz", "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" + "convert-source-map": "0.3.5", + "css": "2.2.4" }, "dependencies": { "convert-source-map": { @@ -5415,7 +5415,7 @@ "resolved": "http://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "requires": { - "ret": "~0.1.10" + "ret": "0.1.15" } }, "safer-buffer": { @@ -5438,7 +5438,7 @@ "resolved": "http://registry.npm.taobao.org/semver-greatest-satisfied-range/download/semver-greatest-satisfied-range-1.1.0.tgz", "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", "requires": { - "sver-compat": "^1.5.0" + "sver-compat": "1.5.0" } }, "set-blocking": { @@ -5451,10 +5451,10 @@ "resolved": "http://registry.npm.taobao.org/set-value/download/set-value-2.0.0.tgz", "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" }, "dependencies": { "extend-shallow": { @@ -5462,7 +5462,7 @@ "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -5472,7 +5472,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "1.0.0" } }, "shebang-regex": { @@ -5490,7 +5490,7 @@ "resolved": "http://registry.npm.taobao.org/simple-swizzle/download/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "requires": { - "is-arrayish": "^0.3.1" + "is-arrayish": "0.3.2" }, "dependencies": { "is-arrayish": { @@ -5510,14 +5510,14 @@ "resolved": "http://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.1" }, "dependencies": { "define-property": { @@ -5525,7 +5525,7 @@ "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -5533,7 +5533,7 @@ "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "source-map": { @@ -5548,9 +5548,9 @@ "resolved": "http://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz", "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" }, "dependencies": { "define-property": { @@ -5558,7 +5558,7 @@ "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -5566,7 +5566,7 @@ "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -5574,7 +5574,7 @@ "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -5582,9 +5582,9 @@ "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -5594,7 +5594,7 @@ "resolved": "http://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz", "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", "requires": { - "kind-of": "^3.2.0" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -5602,7 +5602,7 @@ "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -5617,11 +5617,11 @@ "resolved": "http://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.2.tgz", "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=", "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "atob": "2.1.2", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" } }, "source-map-url": { @@ -5639,8 +5639,8 @@ "resolved": "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.0.tgz", "integrity": "sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ=", "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.3" } }, "spdx-exceptions": { @@ -5653,8 +5653,8 @@ "resolved": "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz", "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "spdx-exceptions": "2.2.0", + "spdx-license-ids": "3.0.3" } }, "spdx-license-ids": { @@ -5667,7 +5667,7 @@ "resolved": "http://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz", "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", "requires": { - "extend-shallow": "^3.0.0" + "extend-shallow": "3.0.2" } }, "sprintf-js": { @@ -5680,15 +5680,15 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "asn1": "0.2.4", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.2", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.2", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" } }, "stable": { @@ -5706,8 +5706,8 @@ "resolved": "http://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "define-property": "0.2.5", + "object-copy": "0.1.0" }, "dependencies": { "define-property": { @@ -5715,7 +5715,7 @@ "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -5740,8 +5740,8 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, "string_decoder": { @@ -5749,7 +5749,7 @@ "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } }, "strip-ansi": { @@ -5757,7 +5757,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } }, "strip-bom": { @@ -5765,7 +5765,7 @@ "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "requires": { - "is-utf8": "^0.2.0" + "is-utf8": "0.2.1" } }, "strip-eof": { @@ -5778,9 +5778,9 @@ "resolved": "http://registry.npm.taobao.org/stylehacks/download/stylehacks-4.0.1.tgz", "integrity": "sha1-MYZZXQR6sN+BPSE+Uci5TguQEPI=", "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" + "browserslist": "4.3.6", + "postcss": "7.0.7", + "postcss-selector-parser": "3.1.1" }, "dependencies": { "postcss-selector-parser": { @@ -5788,9 +5788,9 @@ "resolved": "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.1.tgz", "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", "requires": { - "dot-prop": "^4.1.1", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "dot-prop": "4.2.0", + "indexes-of": "1.0.1", + "uniq": "1.0.1" } } } @@ -5805,8 +5805,8 @@ "resolved": "http://registry.npm.taobao.org/sver-compat/download/sver-compat-1.5.0.tgz", "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" } }, "svgo": { @@ -5814,20 +5814,20 @@ "resolved": "http://registry.npm.taobao.org/svgo/download/svgo-1.1.1.tgz", "integrity": "sha1-EjhLAzNbzs2Fz6X04zdf7WccuYU=", "requires": { - "coa": "~2.0.1", - "colors": "~1.1.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "~0.1.0", + "coa": "2.0.2", + "colors": "1.1.2", + "css-select": "2.0.2", + "css-select-base-adapter": "0.1.1", "css-tree": "1.0.0-alpha.28", - "css-url-regex": "^1.1.0", - "csso": "^3.5.0", - "js-yaml": "^3.12.0", - "mkdirp": "~0.5.1", - "object.values": "^1.0.4", - "sax": "~1.2.4", - "stable": "~0.1.6", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" + "css-url-regex": "1.1.0", + "csso": "3.5.1", + "js-yaml": "3.12.0", + "mkdirp": "0.5.1", + "object.values": "1.0.4", + "sax": "1.2.4", + "stable": "0.1.8", + "unquote": "1.1.1", + "util.promisify": "1.0.0" } }, "symbol-tree": { @@ -5840,8 +5840,8 @@ "resolved": "http://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "readable-stream": "2.3.6", + "xtend": "4.0.1" } }, "through2-filter": { @@ -5849,8 +5849,8 @@ "resolved": "http://registry.npm.taobao.org/through2-filter/download/through2-filter-3.0.0.tgz", "integrity": "sha1-cA54bfI2fCyIzYqlvkz5weeDElQ=", "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" + "through2": "2.0.5", + "xtend": "4.0.1" } }, "time-stamp": { @@ -5868,8 +5868,8 @@ "resolved": "http://registry.npm.taobao.org/to-absolute-glob/download/to-absolute-glob-2.0.2.tgz", "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" + "is-absolute": "1.0.0", + "is-negated-glob": "1.0.0" } }, "to-object-path": { @@ -5877,7 +5877,7 @@ "resolved": "http://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -5885,7 +5885,7 @@ "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -5895,10 +5895,10 @@ "resolved": "http://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz", "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" } }, "to-regex-range": { @@ -5906,8 +5906,8 @@ "resolved": "http://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "3.0.0", + "repeat-string": "1.6.1" } }, "to-through": { @@ -5915,7 +5915,7 @@ "resolved": "http://registry.npm.taobao.org/to-through/download/to-through-2.0.0.tgz", "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", "requires": { - "through2": "^2.0.3" + "through2": "2.0.5" } }, "tough-cookie": { @@ -5923,8 +5923,8 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "psl": "1.1.29", + "punycode": "1.4.1" }, "dependencies": { "punycode": { @@ -5939,7 +5939,7 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "requires": { - "punycode": "^2.1.0" + "punycode": "2.1.1" } }, "trim": { @@ -5957,7 +5957,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.1.2" } }, "tweetnacl": { @@ -5971,7 +5971,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "1.1.2" } }, "typedarray": { @@ -5984,8 +5984,8 @@ "resolved": "http://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.9.tgz", "integrity": "sha1-rwLxgMEgfXZDLkc+0koo9KeCuuM=", "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" + "commander": "2.17.1", + "source-map": "0.6.1" } }, "unc-path-regex": { @@ -5998,15 +5998,15 @@ "resolved": "http://registry.npm.taobao.org/undertaker/download/undertaker-1.2.0.tgz", "integrity": "sha1-M52kZGJS0ILcN45wgGcpl1DhG0k=", "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" + "arr-flatten": "1.1.0", + "arr-map": "2.0.2", + "bach": "1.2.0", + "collection-map": "1.0.0", + "es6-weak-map": "2.0.2", + "last-run": "1.1.1", + "object.defaults": "1.1.0", + "object.reduce": "1.0.1", + "undertaker-registry": "1.0.1" } }, "undertaker-registry": { @@ -6019,7 +6019,7 @@ "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-1.0.3.tgz", "integrity": "sha512-6z+HH3mtlFdj/w3MaQpObrZAd9KRiro370GxBFh13qkV8LYR21lLozA4iQiZPhe7KuX/lHewoGOEgQ4AWrAR3Q==", "requires": { - "wrapped": "^1.0.1" + "wrapped": "1.0.1" } }, "unified-message-control": { @@ -6028,8 +6028,8 @@ "integrity": "sha512-e1dEtN4Z/TvLn/qHm+xeZpzqhJTtfZusFErk336kkZVpqrJYiV9ptxq+SbRPFMlN0OkjDYHmVJ929KYjsMTo3g==", "requires": { "trim": "0.0.1", - "unist-util-visit": "^1.0.0", - "vfile-location": "^2.0.0" + "unist-util-visit": "1.4.0", + "vfile-location": "2.0.3" } }, "union-value": { @@ -6037,10 +6037,10 @@ "resolved": "http://registry.npm.taobao.org/union-value/download/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" }, "dependencies": { "extend-shallow": { @@ -6048,7 +6048,7 @@ "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "set-value": { @@ -6056,10 +6056,10 @@ "resolved": "http://registry.npm.taobao.org/set-value/download/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" } } } @@ -6079,8 +6079,8 @@ "resolved": "http://registry.npm.taobao.org/unique-stream/download/unique-stream-2.3.1.tgz", "integrity": "sha1-xl0RDppK35psWUiygFPZqNBMvqw=", "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" + "json-stable-stringify-without-jsonify": "1.0.1", + "through2-filter": "3.0.0" } }, "unist-util-generated": { @@ -6108,7 +6108,7 @@ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.0.tgz", "integrity": "sha512-FiGu34ziNsZA3ZUteZxSFaczIjGmksfSgdKqBfOejrrfzyUy5b7YrlzT1Bcvi+djkYDituJDy2XB7tGTeBieKw==", "requires": { - "unist-util-visit-parents": "^2.0.0" + "unist-util-visit-parents": "2.0.1" } }, "unist-util-visit-parents": { @@ -6116,7 +6116,7 @@ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.0.1.tgz", "integrity": "sha512-6B0UTiMfdWql4cQ03gDTCSns+64Zkfo2OCbK31Ov0uMizEz+CJeAp0cgZVb5Fhmcd7Bct2iRNywejT0orpbqUA==", "requires": { - "unist-util-is": "^2.1.2" + "unist-util-is": "2.1.2" } }, "unquote": { @@ -6129,8 +6129,8 @@ "resolved": "http://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "has-value": "0.3.1", + "isobject": "3.0.1" }, "dependencies": { "has-value": { @@ -6138,9 +6138,9 @@ "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" }, "dependencies": { "isobject": { @@ -6190,8 +6190,8 @@ "resolved": "http://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.0.tgz", "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "define-properties": "1.1.3", + "object.getownpropertydescriptors": "2.0.3" } }, "uuid": { @@ -6204,7 +6204,7 @@ "resolved": "http://registry.npm.taobao.org/v8flags/download/v8flags-3.1.2.tgz", "integrity": "sha1-/FzQwidCgYHmwpspkuT48dpeDJ8=", "requires": { - "homedir-polyfill": "^1.0.1" + "homedir-polyfill": "1.0.1" } }, "validate-npm-package-license": { @@ -6212,8 +6212,8 @@ "resolved": "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz", "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "spdx-correct": "3.1.0", + "spdx-expression-parse": "3.0.0" } }, "value-or-function": { @@ -6231,9 +6231,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "^1.0.0", + "assert-plus": "1.0.0", "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "extsprintf": "1.3.0" } }, "vfile-location": { @@ -6246,12 +6246,12 @@ "resolved": "http://registry.npm.taobao.org/vinyl/download/vinyl-2.2.0.tgz", "integrity": "sha1-2FsH2pbkWNJbL/4Z/s6fLKoT7YY=", "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" + "clone": "2.1.2", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.1.2", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" } }, "vinyl-fs": { @@ -6259,23 +6259,23 @@ "resolved": "http://registry.npm.taobao.org/vinyl-fs/download/vinyl-fs-3.0.3.tgz", "integrity": "sha1-yFhJQF9nQo/qu71cXb3WT0fTG8c=", "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" + "fs-mkdirp-stream": "1.0.0", + "glob-stream": "6.1.0", + "graceful-fs": "4.1.15", + "is-valid-glob": "1.0.0", + "lazystream": "1.0.0", + "lead": "1.0.0", + "object.assign": "4.1.0", + "pumpify": "1.5.1", + "readable-stream": "2.3.6", + "remove-bom-buffer": "3.0.0", + "remove-bom-stream": "1.2.0", + "resolve-options": "1.1.0", + "through2": "2.0.5", + "to-through": "2.0.0", + "value-or-function": "3.0.0", + "vinyl": "2.2.0", + "vinyl-sourcemap": "1.1.0" } }, "vinyl-sourcemap": { @@ -6283,13 +6283,13 @@ "resolved": "http://registry.npm.taobao.org/vinyl-sourcemap/download/vinyl-sourcemap-1.1.0.tgz", "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" + "append-buffer": "1.0.2", + "convert-source-map": "1.6.0", + "graceful-fs": "4.1.15", + "normalize-path": "2.1.1", + "now-and-later": "2.0.0", + "remove-bom-buffer": "3.0.0", + "vinyl": "2.2.0" } }, "vinyl-sourcemaps-apply": { @@ -6297,7 +6297,7 @@ "resolved": "http://registry.npm.taobao.org/vinyl-sourcemaps-apply/download/vinyl-sourcemaps-apply-0.2.1.tgz", "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", "requires": { - "source-map": "^0.5.1" + "source-map": "0.5.7" }, "dependencies": { "source-map": { @@ -6312,7 +6312,7 @@ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", "requires": { - "browser-process-hrtime": "^0.1.2" + "browser-process-hrtime": "0.1.2" } }, "webidl-conversions": { @@ -6338,9 +6338,9 @@ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "lodash.sortby": "4.7.0", + "tr46": "1.0.1", + "webidl-conversions": "4.0.2" } }, "which": { @@ -6348,7 +6348,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } }, "which-module": { @@ -6366,8 +6366,8 @@ "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "string-width": "1.0.2", + "strip-ansi": "3.0.1" }, "dependencies": { "ansi-regex": { @@ -6380,7 +6380,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "string-width": { @@ -6388,9 +6388,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "strip-ansi": { @@ -6398,7 +6398,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } } } @@ -6409,7 +6409,7 @@ "integrity": "sha1-x4PZ2Aeyc+mwHoUWgKk4yHyQckI=", "requires": { "co": "3.1.0", - "sliced": "^1.0.1" + "sliced": "1.0.1" }, "dependencies": { "co": { @@ -6429,7 +6429,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", "requires": { - "async-limiter": "~1.0.0" + "async-limiter": "1.0.0" } }, "xml-name-validator": { @@ -6457,18 +6457,18 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.3", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" } }, "yargs-parser": { @@ -6476,7 +6476,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" } } } -- 2.11.0