文章分类 -  笔记

摘要:1.KMP 算法 引入 border 下文默认字符串从 1 开始。 \(border\) 的定义,若对于字符串 \(s\),长为 \(n\), 若存在 \(s[1,r]=s[n-r+1,n](r\not=n)\),那么称 \(r\) 为 \(s\) 的 \(border\). \(fail\) 数组 阅读全文
posted @ 2023-05-31 07:34 s1monG 阅读(239) 评论(0) 推荐(0) 编辑
摘要:1.状态设计优化 给个例题:求最长公共子序列, 但是 \(A\) 长度为 \(n=10^6\),\(B\) 长度为 \(m=10^3\)。 \(O(nm)\) 会超时。 不妨设 \(f(i,j)\) 表示取了 \(i\) 个 B,答案是 \(j\),\(A\) 的最小长度。 这样复杂度是 \(O(m 阅读全文
posted @ 2023-05-21 20:28 s1monG 阅读(46) 评论(1) 推荐(1) 编辑
摘要:### 1.线性 dp #### 1.1 P1412 经营与开发 由于前面的操作只会对后面乘一个系数。 所以这题需要倒着 dp。 $f(i) = \max (f(i+1)\cdot k+v,f(i+1))$ $k,v$ 分别为损耗,利益。 ### 2.区间 dp 状态通常为一个区间。 #### 2. 阅读全文
posted @ 2023-05-21 19:02 s1monG 阅读(17) 评论(1) 推荐(0) 编辑
摘要:以 P4719【模板】动态 DP 一题为例。 我们显然可以写出朴素的方程。 考虑有 $v$ 为 $u$ 儿子。 $f_{u,0}=\sum \max(f_{v,0},f_{v,1})$ $f_{u,1}=\sum f_{v,0}$. 答案是 $\max (f_{root,0},f_{root,1}) 阅读全文
posted @ 2023-05-18 15:25 s1monG 阅读(19) 评论(0) 推荐(0) 编辑
摘要:引入 节点由两个集合组成,且两个集合内部没有边的图。 二分图不存在长度为奇数的环。 模型 二分图最大匹配 用匈牙利算法或网络流。 换算成网络流, 二分图最大匹配 = 最大流。 二分图最小点覆盖 König 定理: 最小点覆盖:选最少的点,满足每条边至少有一个端点被选。 最小点覆盖 = 最大匹配。 换 阅读全文
posted @ 2023-05-12 19:36 s1monG 阅读(25) 评论(0) 推荐(0) 编辑
摘要:引入 P2495 [SDOI2011] 消耗战 我们容易发现我们可以有一个 $O(nq)$ 的树形 Dp. 我们称有资源的点为关键点。有 $k$ 个。 设 $dp_u$ 表示 $u$ 子树内不连接任何关键点的最小费用。 $dp_u=dp_u+\min(dp_v,w)$,当 $v$ 非关键点。 $dp 阅读全文
posted @ 2023-05-11 21:33 s1monG 阅读(13) 评论(0) 推荐(0) 编辑
摘要:引入 网络 是有向图。 每条边有权值 \(c(u,v)\),称为容量(Capacity)。 有两个重要的点,源点 \(s\),汇点 \(t\) 。 流 流函数 \(f\) 满足: 容量限制: \(f(u,v)\le c(u,v)\) 斜对称 : \(f(u,v)=-f(u,v)\) 流量守恒 :\( 阅读全文
posted @ 2023-05-07 21:20 s1monG 阅读(18) 评论(1) 推荐(0) 编辑
摘要:1.最短路 引入 Dijkstra Dijkstra 是基于贪心的一种算法,适用于非负权的图,求解单源最短路。 算法是这样的: 找出全局距离最小的点 $u$,并用这个点去更新连接它的 $v$ 点的距离。 时间复杂度 $O(n^2)$,使用堆优化可以优化到 $O(m \log m)$ code pri 阅读全文
posted @ 2023-05-07 19:06 s1monG 阅读(11) 评论(0) 推荐(0) 编辑
摘要:### 1.逆元 #### 引入 我们知道在同余系里面加,减,乘都是可以直接完成。 但是不能除。 我们要想在模 $p$ 意义下除以一个数,就可以乘这个数的逆元。 这个数记作 $x^{-1}$. 满足 $x \cdot x^{-1} \equiv 1 \pmod p$ 线性求 $1\sim n$ 逆元 阅读全文
posted @ 2023-04-23 21:01 s1monG 阅读(23) 评论(0) 推荐(0) 编辑
摘要:1.普通莫队 引入 先介绍莫队。 莫队是一种离线的算法。 莫队基于以下流程。 现在已知区间 \([l,r]\) 的贡献。 我们也可以推出 \([l,r-1]\),\([l-1,r]\),\([l+1,r]\),\([l,r+1]\) 区间的贡献。 诸如这样,我们挪动区间,顺便更新答案,就可以从上一次 阅读全文
posted @ 2023-04-17 21:46 s1monG 阅读(644) 评论(0) 推荐(4) 编辑
摘要:1.李超树 引入 李超线段树是一种维护直线、线段的数据结构。 可插入一条线段或直线,并查询 \(x=p\) 的点上最值的 \(y\) . 构建 李超线段树用了标记永久化的思想。 李超树的每一个节点,设区间为 \([L,R]\) 保存最优直线的编号,这个编号是指 \([L,R]\) 之间 \(mid= 阅读全文
posted @ 2023-04-12 16:13 s1monG 阅读(30) 评论(0) 推荐(0) 编辑
摘要:引入 数据分块(整除分块) 对于 \(\left \lfloor \dfrac{n}{i} \right \rfloor (1\le i\le n)\),最多只有 \(2\sqrt{n}\) 种取值。 所以就可以打包计算。 以求 \(\sum n\mod i\) 为例: 由于 \(n=i\cdot 阅读全文
posted @ 2023-03-28 21:02 s1monG 阅读(31) 评论(0) 推荐(0) 编辑
摘要:前置知识 时间戳(dfn):图的深度优先遍历中,节点第一次被访问的次序。 搜索树:由所有发生递归的边构成。 无向图的割点与桥 割点:若 $u$ 是割点,那么删去 $u$ 点及其相连的边,原图分成二或以上个连通块。 桥(割边):若 $e$ 是桥,那么删去 $e$ 边,原图分成二个连通块。 让我们引入一 阅读全文
posted @ 2023-03-19 18:48 s1monG 阅读(85) 评论(0) 推荐(0) 编辑
摘要:引入 笛卡尔树是一种与堆和平衡树密切相关的数据结构。 笛卡尔树是一种二叉树,每个节点有两个值 \((k,w)\), 其中 \(k\) 满足二叉搜索树的性质, \(w\) 满足堆的性质。 期望的深度是 \(\log n\) 的。 三个性质: 任何子节点 \(w\) 满足小于(或大于)父节点的 \(w\ 阅读全文
posted @ 2023-03-07 15:30 s1monG 阅读(225) 评论(0) 推荐(0) 编辑
摘要:前置知识 平衡树,顾名思义是一种数据结构。 我们一般讨论的是二叉平衡树。 对于每一个子树来说:左子树的所有数比根小,右子树我的所有数比根大。 Splay rotate 先介绍 zig,zag. 可以发现 zig 和 zag 是不改变树的中序遍历的。 这两个操作构成了 rotate 函数,即把一个元素 阅读全文
posted @ 2023-01-13 10:14 s1monG 阅读(85) 评论(0) 推荐(0) 编辑
摘要:可持久化线段树 顾名思义,就是可以存储历史信息的线段树。 比如我们对数组进行了n次修改,然后突然希望回到某个第i次版本。然后又基于这个版本进行一些新的修改等,就是可持久化线段树需要解决的问题。 我们仍然考虑单点修改与区间求和: 要点在哪里呢?实际上关键在于:我们不再修改每个老节点的信息,而是类似于动 阅读全文
posted @ 2022-08-13 15:18 s1monG 阅读(33) 评论(0) 推荐(0) 编辑
摘要:P3195 [HNOI2008]玩具装箱 原始方程 $dp_i=\min(dp_j+(sum_i+i-sum_j-j-L-1)^2)$. 我们设 $a_i=sum_i+i$ $b_i=sum_j+j+L+1$ $dp_i=\min(dp_j+(a_i-b_j)^2)$ 设$dp_i$ 由 $dp_j 阅读全文
posted @ 2022-08-13 13:38 s1monG 阅读(30) 评论(0) 推荐(0) 编辑
摘要:点分治 前置知识:树的重心 树形dp即可。 对于一棵树,我们可以把其中的路径分为两种,一种是过根节点的,一种是不过根节点的。 过根节点的路径我们很容易处理: 我们枚举它的子树,把已经出现过的路径长度维护起来。 当枚举到下一个子树的时候,与上面维护的路径一同计算即可。 对于不过根节点的路径,我们怎么处 阅读全文
posted @ 2022-08-13 13:36 s1monG 阅读(30) 评论(0) 推荐(0) 编辑
摘要:拓欧 求 $ax+by=\gcd(a,b)$ 要想求 $ax+by=\gcd(a,b)$ 先求 $bx'+(a \mod b)y'=\gcd(b,a \mod b)=\gcd(a,b)$ $bx'+(a-(a/b)\times b)y'=ax+by$ $bx'+ay'-((a/b)\times b) 阅读全文
posted @ 2022-08-13 13:36 s1monG 阅读(21) 评论(0) 推荐(0) 编辑
摘要:线段树 线段树本质上的区间操作是把区间分解为一个个区间的分别操作。 如:对于操作$[2,8]$,分解为$[2,2],[3,4],[5,8]$ 对于线段树中的懒标记 (lazytag) 实质上是在一个父亲上整体做的操作而儿子还未进行的操作。 模板线段树2 #include<algorithm> #in 阅读全文
posted @ 2022-08-13 13:36 s1monG 阅读(35) 评论(0) 推荐(0) 编辑