随笔分类 - 笔记
摘要:概述 线段树分裂这里暂时没有。 线段树合并是指将管辖范围相同的两棵线段树对位(节点意义下)合并。 线段树合并 线段树合并支持各种统计子树的操作。 详细来讲就是,考虑某个题目给出一棵树(相对于普通线段树题目的数组而言,这里是每个树上点都对应着一个数组,不过父子之间数组差异往往较小),然后要询问某些子树
阅读全文
摘要:概述 最小割在实质上是一种很...精妙的模型,与状压中的依赖式问题一样,都在一定程度上反映着决策之间的矛盾。 每一条从 $S$ 到 $T$ 的路径,其上的边都满足某种矛盾关系,必有一条边删掉。 根据对应边是实际边(即希望参与删除的)还是结构边(即为构成路径而添加的虚边或不许删的边,不希望参与删除),
阅读全文
摘要:虚树 概述 虚树,即将树的一系列关键点及其 $lca$ 取出得到的一棵反映这些点在原树上的关系的树。 容易证明,维护一个按 $dfn$ 升序排序的优先队列,不断从队头取出两个元素求 $lca$ 后放回直到队列中只剩一个元素,所得的所有点就是虚树的所有点。显然,这代表着虚树的点数是 $\leqslan
阅读全文
摘要:概述 单调栈,顾名思义,是元素满足单调性的栈。其主要用于预处理各种和偏序有关的信息。 特别地,我们将悬线法视为单调栈的一个变形,也在这里谈及。 所有二维平面问题采用 OI 坐标系。 实现原理 在准备加入元素时,将栈顶元素弹出直到加入后仍然满足单调性。 例题 P5788 【模板】单调栈/P1901 发
阅读全文
摘要:概述 最短路算法主要研究图上两点之间的最短路径问题。 事实上,许多问题都能转化为图来求解(图的本质就是点和边的集合,点是元素,边是元素之间的二元关系)。 所以最短路算法并不局限于“给出一张图,...”。 Floyd il void floyd(){ for(int k=1;k<=n;++k) for
阅读全文
摘要:概述 李超线段树是真正用于维护“线段”的线段树。 具体来说,李超线段树主要用于维护平面上线段(表现为给出定义域的一次函数)信息,通常为某处的最大/小值等。 实现原理 不妨以加线段,查询 $l:x=k$ 与所有线段的交点的最大纵坐标为例。 众所周知,区间加等差数列,区间求和是容易的。然而区间取 $\m
阅读全文
摘要:钦定顺序特别重要,这不仅关乎到可能的去重,也关乎到简化问题。当然,错误的顺序可能会使问题更复杂(来自图上状压计数)。 如果觉得题目无从下手,考虑 DP(来自蜜蜂搬家)。尝试着设计一个不管有多复杂的 DP 状态,然后一点一点把握题目中各个要素的关系,找到转移的途径;考虑尽量简洁地描述题目要素之间的关系
阅读全文
摘要:概述 线段树优化通过线段树能快速区间取值和区间修改的特性,高效实现具有连续性的 dp 转移。 所谓的连续性可以是顺推的转移目标点为连续区间,也可以是逆推的转移出发点为连续区间,这一连续不一定必须是原数组下标这一维度上的。 效果一般为将 KD1D 的 dp 的 $O(n)$ 的转移优化至 $O(\lo
阅读全文
摘要:线套线 规定使用 OI 坐标系。 (按我的代码习惯)竖着关于 $1\sim n$ 建一棵线段树,该线段树的每个节点都是一棵内层线段树,若该节点的管辖区间为 $[L,R]$,则该内层线段树的管辖范围为 $l,r$ 的节点的实际管辖矩形为 $(L,l)\sim (R,r)$。 单点加,矩形查 修改:在外
阅读全文
摘要:(强制在线)单点修,区间第 $k$ 小 首先有一个简单的序列分块+值域二分做法: 序列分块,对每个块建值域树状数组。 修改时暴力修改,$O(\log)$。 询问时将两侧散块合并建一个虚块,然后在值域上二分,在每块内查询,$O(B\log+num\log^2)$。 显然这是可平衡的,令 $B=num\
阅读全文
摘要:竞赛图 姑且先挂载在这里。 性质 1:竞赛图缩点所得必为一条链,链上的重构点称为 Tier,Tier 1 是拓扑序最高的。 性质 2:出度最大的点必然在 Tier 1 中。 将所有点分为三类,第一类是出度最大的某个点 $u$,第二类是被 $k$ 直接指向的点,第三类是剩余的点。 不妨设存在点 $v$
阅读全文
摘要:概述 自动机是一种对信号序列进行判定的数学模型。 信号序列:一串有序的信号,例如字符串。 判定:指输出为 $0/1$(在输入的信号序列可识别的前提下)。在 OI 中的自动机一般是广义的,即输出是任意的,具体来讲可能是在合法时输出对应方案的权值之类。 一般来讲,自动机可以抽象为一个有向图,点为状态,边
阅读全文
摘要:概述 有时,我们维护的数据结构是静态的,但题目却要求加/删。 如果题目满足元素互相独立,则考虑定期重构吧! 加入:将加入但还未整合到数据结构中的元素放入一个栈中,询问时暴力扫这个栈,到达阈值后将栈整合入数据结构,重新 build 一遍即可。 删除:考虑反演,我指的是算贡献(这要求贡献满足可减性,不过
阅读全文
摘要:概述 LCA(least common ancestor),最近公共祖先的英文缩写。 顾名思义,LCA 就是树上两个点最近的公共祖先,或者说两个点共同在的极小子树的根。 树上差分则是利用树本身的结合性(显然树不满足差分性,是点到根的链满足差分性)与 LCA 结合做的操作,譬如给某个路径上所有点 $+
阅读全文
摘要:概述 长链剖分通过把树剖成尽量长的多个链,高效地解决...我也不知道解决啥(长剖优化 DP 的东西在 DP 优化那边)。 毕竟这个东西,不具备启发式分裂的复杂度。不过其还是有一点性质的,有时候确实会用到... 恰如轻重剖是按 $siz$ 选重儿子,长剖是按 $dep$(这里指当前子树的最大深度)来选
阅读全文
摘要:概述 轻重链剖分通过将树剖分为若干条重链和它们之间相连的轻边,将树上路径问题转化成序列问题。 具体来讲,有很多树上路径问题本质上是把序列上的问题搬到了树上,此时我们可以进行轻重链剖分(后简记为轻重剖或重剖),将树上路径拆分为多条重链头尾相接,并通过能快速维护重链信息的数据结构来求解。 重剖方式如下:
阅读全文
摘要:前缀函数 前缀函数 \(\pi_i\) 为 \(s_{1\sim i}\) 的最大相同真前后缀长度,也即 \(s_{1\sim i}\) 的最长 border。 如无特别说明,本文中所有字符串下标从 \(1\) 开始,长度为 \(n\)。 考虑怎么求前缀函数。 首先肯定能想到暴力的 \(O(n^3)
阅读全文
摘要:概述 坐,都坐。我知道各位都很激动,但这个缩写的全称是 Aho-Corasick automaton,AC 是两位发明者的姓氏,automaton:自动机。 AC 自动机通过将 trie 的结构和 KMP 的思想结合起来,利用 trie 的结构存储多模式串(或者说构建对应的图论模型),然后将 KMP
阅读全文