4.9k words
单调队列优化 DP 前置知识:单调队列 一,概览 某些特定 DP,其当前状态的所有值都可以通过上一状态的某个连续段得到,要对这个连续段求区间最值,相邻状态的区间上下界单调变化。 对于这类动态规划问题,发现我们可以在状态转移当中引入单调队列,对 DP 进行优化。 二,思路 例题:最大子序和 给定一个长度为 \(N\) 的整数序列,从中找出一段长度不超过 \(M\) 的连续子序列,使得子序列中所有数的和最大。\(N,M\leq 3\times 10^5\)。 对于这道题,其答案可以形式化表示为: \(ans=\) \(max_{1\leq i\leq N}\) \((sum[i]-\) \(min_{i-M\leq j\leq i-1}\) \(sum[j])\) 其中,\(i\) 类似于动态规划中的状态,\(j\) 类似于动态规划中的决策。我们从小到大枚举每个 \(i\in[1,N]\) 时,当 \(i\) 增大 \(1\) 时,\(j\) 的取值范围 \([i-M,i-1]\) 的上下界也同时增大 \(1\),变为 \([i-M+1...
777 words
单调队列 一,概览 单调队列的重点在于单调和队列 单调反映了元素变化的规律是递增或递减; 队列意味着对元素的操作只能在队头和队尾进行。 二,实现 建立一个队列,考虑要向里插入一个元素: 比较要插入的元素和现有的队尾,若满足所需的单调性,则直接插入队尾,若不满足单调性,则重复弹出队尾直到满足单调性或队列为空,之后将新元素插入队尾。 单调队列最经典的实现就是滑动窗口,即给出一个数组 \(a_{1,2,...,n}\),给出一个长度 \(k\),在数组中找到每一段长为 \(k\) 的区间的区间最值。 模板题面 Luogu P1886 滑动窗口/【模板】单调队列 有一个长为 \(n\) 的序列 \(a\),以及一个大小为 \(k\) 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。 输入一共有两行,第一行有两个正整数 \(n,k\)。 第二行 \(n\) 个整数,表示序列 \(a\) 输出共两行,第一行为每次窗口滑动的最小值 第二行为每次窗口滑动的最大值 样例输入 #1 128 ...
584 words
左偏树 左偏树是可并堆的一种,具有堆的性质,可快速合并. 维护如下信息:\(\text{val}\):权值,\(\text{ls}\):左儿子,\(\text{rs}\):右儿子,\(\text{dist}\):距离,\(\text{fa}\):父亲。 一,dist 对于一棵二叉树,我们定义外结点为左儿子或右儿子为空的结点。 定义一个外结点的 \(\text{dist}\) 为 \(1\),非外结点的 \(\text{dist}\) 为其到子树中最近外结点的距离加一,空结点的 \(\text{dist}\) 为 \(0\)。 现在有一棵 \(n\) 个结点的二叉树,则有如下性质: 根的 \(\text{dist}\) 不超过 \([log(n+1)]\); 若该二叉树根的 \(\text{dist}\) 为 \(x\),则至少有 \(x-1\) 层为满二叉树,至少有 \(2^x-1\) 个结点。 二,左偏树的性质 左偏树是一棵二叉树,它具有如下性质: 堆的性质; 每个结点左儿子的 \(\text{dist}\) 大于等于右儿子的 \...
1.6k words
AC 自动机 AC 自动机是以 Trie 树结构为基础,结合 KMP 思想建立的自动机,用于解决多模式匹配等任务。 一,概览 用两步建立一个 AC 自动机: 建立 Trie 树。(以 Trie 树为基础) 对 Trie 树上的所有结点构造失配指针。(结合 KMP 思想) 之后便可以用它进行匹配了。 二,字典树构建 AC 自动机所用的 Trie 就是普通的 Trie。 在 Trie 当中,结点表示某个模式串的前缀。Trie 的结点表示状态,边表示转移。 对于若干模式串 \(s_1,s_2,...,s_n\),将它们构建成字典树后所有状态的集合记为 \(Q\)。 123456789101112int cnt,tr[1000005][26],ended[1000005];void insert(string s){ int u=0; for(int i=0;s[i];i++) { if(!tr[u][s[i]-'a']) tr[u][s[i]-'a...
892 words
自动机 自动机是一种对信号序列进行判定的数学模型 一,主观理解 以上为自动机的定义,该定义十分抽象,以下为笔者的主观理解。 1. 自动机建立的基础 即定义中的“信号序列”。 我们可以把这个所谓“信号序列”理解为一个串,串的每一位上存有信息。 eg. 字符串是一个“信号序列”,数组是一个“信号序列”,一个数的各位可以构成一个“信号序列”。 自动机便是建立在信号序列的基础上的。 2. 自动机要干什么 即定义中的“判定”。 对针对信号序列的特定命题给出真或假的回答。 eg. 判断一个数是奇数还是偶数是判定,判断一个字符串是否回文是判定,判断一个字符串是否是一特定字符串的子串是判定。 3. 自动机的具象化理解 虽然自动机是一个抽象的数学模型,但在 OI 里,自动机常可以被理解为一张有向图,我们把自动机所求的判定拆解为若干小判定,每一个结点都代表某次判定时的状态,结点向结点转移便是判定的过程,判定会有多种结果,因而一个结点的不同子结点便代表判定的不同结果。 以下图片有助于更好地理解: eg. 在 Trie 树上查找某字符串是...