From c217a50e300fc85c4df4f06410961f84fca9a994 Mon Sep 17 00:00:00 2001 From: Ir1d Date: Sat, 8 Sep 2018 11:08:48 +0800 Subject: [PATCH] style(add required space and delete unnecessary #): --- docs/ds/splay.md | 34 ++++++++++++++--------------- docs/math/mobius.md | 46 ++++++++++++++++++++-------------------- docs/misc/complexity.md | 2 +- docs/misc/hill-climbing.md | 8 +++---- docs/misc/simulated-annealing.md | 12 +++++------ 5 files changed, 51 insertions(+), 51 deletions(-) diff --git a/docs/ds/splay.md b/docs/ds/splay.md index b63ba573..9b6003b6 100644 --- a/docs/ds/splay.md +++ b/docs/ds/splay.md @@ -2,21 +2,21 @@ --- -# 简介 # +# 简介 $\text{Splay}$ 是一种二叉查找树,它通过不断将某个节点旋转到根节点,使得整棵树仍然满足二叉查找树的性质,并且保持平衡而不至于退化为链,它由 Daniel Sleator 和 Robert Tarjan 发明。 --- -# 结构 # +# 结构 -### 二叉查找树的性质 ### +### 二叉查找树的性质 首先肯定是一棵二叉树! 能够在这棵树上查找某个值的性质:左儿子的值 $<$ 根节点的值 $<$ 右儿子的值。 -### 节点维护信息 ### +### 节点维护信息 |$rt$|$tot$|$fa[i]$|$ch[i][0/1]$|$val[i]$|$cnt[i]$|$sz[i]$| |:----|:----|:----|:----|:----|:----|:----| @@ -24,9 +24,9 @@ $\text{Splay}$ 是一种二叉查找树,它通过不断将某个节点旋转 --- -# 操作 # +# 操作 -### 基本操作 ### +### 基本操作 - $\text{maintain}(x)$:在改变节点位置前,将节点 $x$ 的 $\text{size}$ 更新。 - $\text{get}(x)$:判断节点 $x$ 是父亲节点的左儿子还是右儿子。 @@ -43,7 +43,7 @@ void clear(int x) { } ``` -### 旋转操作 ### +### 旋转操作 为了使 $\text{Splay}$ 保持平衡而进行旋转操作,旋转的本质是将某个节点上移一个位置。 @@ -75,7 +75,7 @@ void rotate(int x) { } ``` -### Splay 操作 ### +### Splay 操作 $\text{Splay}$ 规定:每访问一个节点后都要强制将其旋转到根节点。此时旋转操作具体分为 $6$ 种情况讨论(其中 $x$ 为需要旋转到根的节点) @@ -94,7 +94,7 @@ void splay(int x) { } ``` -### 插入操作 ### +### 插入操作 插入操作是一个比较复杂的过程,具体步骤如下(插入的值为 $k$): @@ -133,7 +133,7 @@ void ins(int k) { } ``` -### 查询 x 的排名 ### +### 查询 x 的排名 根据二叉查找树的定义和性质,显然可以按照以下步骤查询 $x$ 的排名: @@ -161,7 +161,7 @@ int rk(int k) { } ``` -### 查询排名 x 的数 ### +### 查询排名 x 的数 设 $k$ 为剩余排名,具体步骤如下: @@ -183,7 +183,7 @@ int kth(int k) { } ``` -### 查询前驱 ### +### 查询前驱 前驱定义为小于 $x$ 的最大的数,那么查询前驱可以转化为:将 $x$ 插入(此时 $x$ 已经在根的位置了),前驱即为 $x$ 的左子树中最右边的节点,最后将 $x$ 删除即可。 @@ -195,7 +195,7 @@ int pre() { } ``` -### 查询后继 ### +### 查询后继 后继定义为大于 $x$ 的最小的数,查询方法和前驱类似:$x$ 的右子树中最左边的节点。 @@ -207,7 +207,7 @@ int nxt() { } ``` -### 删除操作 ### +### 删除操作 删除操作也是一个比较复杂的操作,具体步骤如下: @@ -237,7 +237,7 @@ void del(int k) { --- -# 完整代码 # +# 完整代码 ```cpp #include @@ -364,7 +364,7 @@ int main() { --- -# 例题 # +# 例题 以下题目都是裸的 $\text{Splay}$ 维护二叉查找树。~~(直接套板子即可)~~ @@ -372,7 +372,7 @@ int main() { - [[HNOI2002]营业额统计](https://www.lydsy.com/JudgeOnline/problem.php?id=1588) - [[HNOI2004]宠物收养所](https://www.lydsy.com/JudgeOnline/problem.php?id=1208) -# 练习题 # +# 练习题 [bzoj 1552 [Cerc2007] robotic sort](https://www.lydsy.com/JudgeOnline/problem.php?id=1552) (权限题) diff --git a/docs/math/mobius.md b/docs/math/mobius.md index ebc4fb22..bc0c6dfa 100644 --- a/docs/math/mobius.md +++ b/docs/math/mobius.md @@ -1,4 +1,4 @@ -## 简介 ## +## 简介 莫比乌斯反演是数论中的重要内容。对于一些函数 $f(n)$,如果很难直接求出它的值,而容易求出其倍数和或约数和 $g(n)$,那么可以通过莫比乌斯反演简化运算,求得 $f(n)$ 的值。 @@ -6,13 +6,13 @@ --- -## 积性函数 ## +## 积性函数 -### 定义 ### +### 定义 若 $\gcd(x,y)=1$ 且 $f(xy)=f(x)f(y)$,则 $f(n)$ 为积性函数。 -### 性质 ### +### 性质 若 $f(x)$ 和 $g(x)$ 均为积性函数,则以下函数也为积性函数: @@ -29,7 +29,7 @@ h(x)&=\sum_{d\mid x}f(d)g(\frac{x}{d}) $$ -### 例子 ### +### 例子 $$ @@ -52,9 +52,9 @@ $$ --- -## Dirichlet 卷积 ## +## Dirichlet 卷积 -### 定义 ### +### 定义 定义两个数论函数 $f,g$ 的 $\text{Dirichlet}$ 卷积为 @@ -64,13 +64,13 @@ $$ $$ -### 性质 ### +### 性质 $\text{Dirichlet}$ 卷积满足交换律和结合律。 其中 $\varepsilon$ 为 $\text{Dirichlet}$ 卷积的单位元(任何函数卷 $\varepsilon$ 都为其本身) -### 例子 ### +### 例子 $$ @@ -86,13 +86,13 @@ $$ --- -## 莫比乌斯函数 ## +## 莫比乌斯函数 -### 定义 ### +### 定义 $\mu$ 为莫比乌斯函数 -### 性质 ### +### 性质 莫比乌斯函数不但是积性函数,还有如下性质: @@ -109,7 +109,7 @@ $$ $$ -### 证明 ### +### 证明 $$ @@ -130,7 +130,7 @@ $$ 根据二项式定理,易知该式子的值在 $k=0$ 即 $n=1$ 时值为 $1$ 否则为 $0$,这也同时证明了 $\displaystyle\sum_{d\mid n}\mu(d)=[n=1]$ -### 补充结论 ### +### 补充结论 反演结论:$\displaystyle [gcd(i,j)=1] \Leftrightarrow\sum_{d\mid\gcd(i,j)}\mu(d)$ @@ -139,7 +139,7 @@ $$ - **利用 $\varepsilon$ 函数**:根据上一结论,$[\gcd(i,j)=1]\Rightarrow \varepsilon(\gcd(i,j))$,将 $\varepsilon$ 展开即可。 -### 线性筛 ### +### 线性筛 由于 $\mu$ 函数为积性函数,因此可以线性筛莫比乌斯函数(线性筛基本可以求所有的积性函数,尽管方法不尽相同)。 **代码**: @@ -160,7 +160,7 @@ void getMu() { } ``` -### 拓展 ### +### 拓展 证明 @@ -196,9 +196,9 @@ $$ --- -## 莫比乌斯反演 ## +## 莫比乌斯反演 -### 公式 ### +### 公式 设 $f(n),g(n)$ 为两个数论函数。 @@ -218,7 +218,7 @@ g(n)=\sum_{d\mid n}\mu(d)f(\frac{n}{d}) $$ -### 证明 ### +### 证明 - **暴力计算**: @@ -238,9 +238,9 @@ $$ --- -## 问题形式 ## +## 问题形式 -### [「HAOI 2011」Problem b](https://www.lydsy.com/JudgeOnline/problem.php?id=2301) ### +### [「HAOI 2011」Problem b](https://www.lydsy.com/JudgeOnline/problem.php?id=2301) 求值(多组数据) @@ -348,7 +348,7 @@ int main() { } ``` -### [「SPOJ 5971」LCMSUM](https://www.luogu.org/problemnew/show/SP5971) ### +### [「SPOJ 5971」LCMSUM](https://www.luogu.org/problemnew/show/SP5971) 求值(多组数据) @@ -443,7 +443,7 @@ int main() { } ``` -### [「BZOJ 2154」Crash的数字表格](https://www.lydsy.com/JudgeOnline/problem.php?id=2154) ### +### [「BZOJ 2154」Crash的数字表格](https://www.lydsy.com/JudgeOnline/problem.php?id=2154) 求值(对 $20101009$ 取模) diff --git a/docs/misc/complexity.md b/docs/misc/complexity.md index 9a1b31d9..ce0e23db 100644 --- a/docs/misc/complexity.md +++ b/docs/misc/complexity.md @@ -3,7 +3,7 @@ 一般的来说,复杂度是一个关于输入长度的一个函数。对于某些算法来说,相同的输入的不同输入依然会造成算法的运行时间/空间的不同,因此我们通常使用算法的最坏时间复杂度,记为 $T(n)$ 。对于一些特殊的情况,我们可能会关心它的平均情况复杂复杂度(特别是对于随机算法 (randomized algorithm) ),这个时候我们通过使用随机分析 (probabilistic analysis)来得到期望的复杂度。 -##渐进符号 +## 渐进符号 我们通常使用渐进符号来描述一个算法的复杂度。 ### $\Theta$ 符号 diff --git a/docs/misc/hill-climbing.md b/docs/misc/hill-climbing.md index c779416d..99d5c16b 100644 --- a/docs/misc/hill-climbing.md +++ b/docs/misc/hill-climbing.md @@ -1,10 +1,10 @@ -## 简介 ## +## 简介 爬山算法是一种局部择优的方法,采用启发式方法,是对深度优先搜索的一种改进,它利用反馈信息帮助生成解的决策。 --- -## 实现 ## +## 实现 爬山算法每次在当前找到的最优方案 $x$ 附近寻找一个新方案(一般随机差值)。如果这个新的解 $x'$ 更优,那么转移到 $x'$ 否则不变。 @@ -16,7 +16,7 @@ --- -## 代码 ## +## 代码 此处代码以 [「BZOJ 3680」吊打XXX](https://www.lydsy.com/JudgeOnline/problem.php?id=3680)(求 $n$ 个点的带权类费马点)为例。 @@ -55,6 +55,6 @@ int main() { --- -## 劣势 ## +## 劣势 其实爬山算法的劣势上文已经提及:它容易陷入一个局部最优解。当目标函数不是单峰函数时,这个劣势是致命的。因此我们要引进 [**模拟退火**](https://oi-wiki.org/misc/simulated-annealing/)。 diff --git a/docs/misc/simulated-annealing.md b/docs/misc/simulated-annealing.md index a6cd5434..0486e1e2 100644 --- a/docs/misc/simulated-annealing.md +++ b/docs/misc/simulated-annealing.md @@ -1,10 +1,10 @@ -## 简介 ## +## 简介 模拟退火是一种随机化算法。当一个问题的方案数量极大(甚至是无穷的)而且不是一个单峰函数时,我们常使用模拟退火求解。 --- -## 实现 ## +## 实现 根据 [爬山算法](https://oi-wiki.org/misc/hill-climbing/) 的过程,我们发现:对于一个当前最优解附近的非最优解,爬山算法直接舍去了这个解。而很多情况下,我们需要去接受这个非最优解从而跳出这个局部最优解,即为模拟退火算法。 @@ -14,7 +14,7 @@ 由于退火的规律引入了更多随机因素,那么我们得到最优解的概率会大大增加。于是我们可以去模拟这个过程,将目标函数作为能量函数。 -### 模拟退火算法描述 ### +### 模拟退火算法描述 先用一句话概括:如果新状态的解更优则修改答案,否则以一定概率接受新状态。 @@ -30,7 +30,7 @@ $$ **注意**:我们有时为了使得到的解更有质量,会在模拟退火结束后,以当前温度在得到的解附近多次随机状态,尝试得到更优的解(其过程与模拟退火相似)。 -### 如何退火(降温)? ### +### 如何退火(降温)? 模拟退火时我们有三个参数:初始温度 $T_0$,降温系数 $d$,终止温度 $T_k$。其中 $T_0$ 是一个比较大的数,$d$ 是一个非常接近 $1$ 但是小于 $1$ 的数,$T_k$ 是一个接近 $0$ 的正数。 @@ -42,7 +42,7 @@ $$ --- -## 代码 ## +## 代码 此处代码以 [「BZOJ 3680」吊打XXX](https://www.lydsy.com/JudgeOnline/problem.php?id=3680)(求 $n$ 个点的带权类费马点)为例。 @@ -100,7 +100,7 @@ int main() { --- -## 习题 ## +## 习题 - [「BZOJ 3680」吊打XXX](https://www.lydsy.com/JudgeOnline/problem.php?id=3680) - [「JSOI 2016」炸弹攻击](https://www.lydsy.com/JudgeOnline/problem.php?id=4852) -- 2.11.0