算法与数据结构
文章平均质量分 87
Evan_song1234
本人是GZEZ初三OIer,RP++
展开
-
莫比乌斯反演
莫比乌斯反演主要用于快速计算一些式子(包含gcdij等)。至于如何应用,往下看。原创 2023-03-20 13:46:43 · 284 阅读 · 1 评论 -
凸包及其算法
一个能够将所有给定点围住的。:在当前组成凸包的点集V0中新增一个不在凸包上的点,形成新点集V1,若可以使V1中所有点都在V1的点的凸包上,则这个凸包不稳定。反之,则是稳定凸包。原创 2023-02-15 18:49:45 · 410 阅读 · 0 评论 -
DP优化 - 斜率优化
若满足单调性,则可以用单调队列解决,之后假设。开始,不断上移,直到碰到第一个碰到的点。所以说,原方程相当于求过所有满足。,我们每次判断单调队列中前两个点。的情况,因为另一个与这个相似。单调队列储存了凸包上的一些节点。求出切点后,我们对应可以求出。这个问题可以使用凸包解决。组成线段的斜率是否小于。假设当前的 DP 方程为。我们可以用平衡树,二分,然后求出凸包上斜率为。维护一个动态凸包即可。原创 2023-02-10 22:09:36 · 426 阅读 · 0 评论 -
DP优化 - 四边形不等式优化
四边形不等式优化是 DP 优化中的一种,它可以将 $O(n^3)$ 的时间复杂度下降到 $O(n^2)$原创 2023-02-07 14:00:27 · 596 阅读 · 0 评论 -
WQS二分
WQS二分就是WQS二分,他是一种二分,需要用到二分的思路来解决WQS二分的题目。原创 2023-01-08 22:09:55 · 368 阅读 · 0 评论 -
扩展欧几里得算法 - exgcd
扩展欧几里得算法,就是欧几里得算法的扩展。原创 2023-01-04 16:44:21 · 437 阅读 · 0 评论 -
线段树 - 从入门到入土
我们要学习线段树,首先要了解线段树的结构长什么样。线段树是一颗二叉树,树上的节点储存数据(可以是值、字符串、数组、多个值)。原创 2023-01-04 15:34:57 · 354 阅读 · 0 评论 -
莫队 - 基础与扩展
莫队可以说是一个算法,但更多是一种思想。我们先来看看普通莫队解决的问题:有一个长度为n的数列a。qa在[li,ri]中有多少个不同的数。不强制在线。1≤n,q≤5×105遇到这种区间问题,第一个想法是前缀和,但很快会发现不可行。于是你搬出了树状数组,切了这道题(于是考虑其他做法。如果目前知道了[l,r]这个区间内的答案,你可以在O(1)时间内求出[l−1,r],[l+1,r],[l,r−。原创 2022-12-30 23:58:42 · 730 阅读 · 0 评论 -
珂朵莉树 ODT
珂朵莉树是一种比较暴力的数据结构,一般需要数据随机,且有区间推平操作。原创 2022-07-31 20:48:47 · 194 阅读 · 0 评论 -
回文自动机 PAM
回文自动机是一个用来维护一个字符串的回文子串的工具可以应用于求本质不同回文子串个数,回文子串出现次数,最小回文划分等问题。原创 2022-07-27 09:44:57 · 354 阅读 · 0 评论 -
Link-Cut-Tree 树上操作
LCT\tt LCTLCT,即 Link\texttt{Link}Link-Cut\texttt{Cut}Cut-Tree\texttt{Tree}Tree,是一种维护森林的数据结构。比树链剖分支持更多操作,比如说树上翻转权值。前置知识Splay\tt SplaySplay 和其文艺平衡树用法算法用途维护森林,以更大的常数和复杂度支持更多的操作。算法复杂度时间O(nlogn+mlogn)O(n \log n + m \log n)O(nlogn+mlogn)空间O(n)O(n)O(n原创 2022-04-05 00:43:42 · 161 阅读 · 0 评论 -
斐波那契堆
斐波那契堆有两种用途。第一种,斐波那契堆支持一系列操作,这些操作构成了“可合并堆”。第二种,斐波那契堆的一些操作可以在常数时间(摊还)内完成,使得这些数据结构非常适合用于频繁调用这些操作。可合并堆可以实现以下操作:MAKE-HEAP()\text {MAKE-HEAP}()MAKE-HEAP():创建一个新的可合并堆,堆中不含任何元素。INSERT(H,x)\text {INSERT}(H, x)INSERT(H,x):在可合并堆 HHH 中插入 xxx。MININUM(H)\text{MININ原创 2022-03-06 11:03:37 · 1594 阅读 · 0 评论 -
网络流及其算法
网络流源点流量为 inf\infinf 的一个点,网络流起点,一般用 sss 表示。汇点接收流量的一个点,网络流终点。弧一条有向边。弧的流量实际通过这条弧的流量。弧的容量指的是一条弧的最大流量。网络流所有弧上流量的集合。增广路径从源点 sss 到汇点 ttt 的一条可以有流量的路径。可行弧也成允许弧,当 (i,j)(i, j)(i,j) 为一个可行弧时,di=dj+1d_i=d_j+1di=dj+1,ddd 为当前点 bfsbfsbfs 时的深度可行流一张图能够达成原创 2022-02-08 11:38:55 · 1564 阅读 · 0 评论 -
二分图及其算法
二分图参见度娘:二分图又称作二部图,是图论中的一种特殊模型。设 G=(V,E)G= (V,E)G=(V,E) 是一个无向图,如果顶点 VVV 可分割为两个互不相交的子集 (A,B)(A,B)(A,B),并且图中的每条边 (i,j)(i,j)(i,j) 所关联的两个顶点 iii 和 jjj 分别属于这两个不同的顶点集 (i∈A,j∈B)(i \in A, j \in B)(i∈A,j∈B),则称图 GGG 为一个二分图。说白了就是:匹配二分图 G=(V,E)G= (V,E)G=(V,E) 中,原创 2022-02-06 22:11:13 · 1361 阅读 · 0 评论 -
点分治 - 处理树上问题的工具
点分治主要是用来处理树上路径问题的工具。前置知识树的重心问题计算树上所有路径的长度和(用点分治来算)。算法实现我们在树上选定一个点 uuu(然后把 uuu 当成根),可以将树上任意两点间的路径分为两种经过 uuu 的,也就是两个点分别在 uuu 的不同子树上。没有经过 uuu 的,也就是两个点在 uuu 的同一个子树内。这个时候,我们就可以分类计算。经过 uuu 的我们设这条经过 uuu 的路径两端分别是为 xxx 和 yyy。那么我们就是要计算 uuu 到 xxx 的距离再加上原创 2022-01-25 08:42:10 · 99 阅读 · 0 评论 -
分块 - 暴力的算法
顾名思义,分块,就是分成块的意思前置知识暴力算法用途跟线段树一样,也是一个维护数组的工具分块时间复杂度虽然没有线段树那么优,但是功能和码量都更胜一筹。算法复杂度时间修改和查询都在 O(n)\tt O(\sqrt{n})O(n)空间O(n)\tt O(n)O(n)算法实现将数组分成多块,每块维护他的和。(每块包含的元素个数肯定要相同了)这时候你可能会问了,如果数组分成多块后还剩下几个元素怎么办。我们强行加入最后分的那块里:查询每次区间查询,查询的区间会包括一些小块,和左右两原创 2022-01-16 15:09:03 · 182 阅读 · 3 评论 -
DP 优化 - 矩阵快速幂优化
以矩阵快速幂方式优化 DP。原创 2021-12-17 20:23:59 · 245 阅读 · 2 评论 -
扩展BSGS算法
普通 BSGSBSGSBSGS 有一个缺点,就是当 gcd(n,p)≠1\gcd(n,p) \not = 1gcd(n,p)=1 时,他不能用。于是就出现了扩展 BSGSBSGSBSGS。前置知识普通 BSGSBSGSBSGS。扩展欧拉定理算法用途用于求解 gcd(n,p)≠1\gcd(n,p) \not=1gcd(n,p)=1 时,nx≡m(modp)n^x \equiv m \pmod pnx≡m(modp) 的方程(除了 xxx 都是常数)算法复杂度时间?空间?原创 2021-12-02 13:49:23 · 237 阅读 · 0 评论 -
Baby-Step-Giant-Step算法
Baby\bf BabyBaby-Step\bf StepStep-Giant\bf GiantGiant-Step\bf StepStep,简称 BSGS\bf BSGSBSGS 或 拔山盖世我们这竟然有人管他叫 BIG\bf BIGBIG-Step\bf StepStep-Giant\bf GiantGiant-Step\bf StepStep,大步超大步???前置知识取模运算 amod ba\mod bamodb。次方运算 axa^xax算法用途普通的 BSGSBSGSBSGS 算法用于原创 2021-12-02 13:41:21 · 172 阅读 · 0 评论 -
平衡树 - 红黑树
红黑树搞了4天,终于AC了…首先红黑树的前生是2-3树,也称B树=自己学去(其实是我懒)红黑树的性质有5个:每个节点只有黑色或者红色根节点是黑色NULL节点(空节点)是黑色每个红色节点的子节点必须是黑色每个节点到他的子树的所有NULL节点的路径上的黑色节点一样多从性质5,我们可以推出,每个红色节点必须有两个黑色节点。(空节点也算黑色)红黑树的插入:我们插入的节点是什么颜色,当然是红色了,这样最少更改满足性质 5。插入分为种情况此树为空树。插入原创 2021-11-08 18:37:37 · 184 阅读 · 0 评论 -
回文串查找 - manacher算法
Manacher’s Algorithm\texttt{Manacher's Algorithm}Manacher’s Algorithm 是用来查找一个字符串的最长回文子串的线性方法,由一个叫 Manacher\texttt{Manacher}Manacher 的人在 1975\texttt{1975}1975 年发明的,广大 OIer\texttt{OIer}OIer都叫他马拉车算法。当然还有些人管这叫没马拉车比如说wxd查找回文串最简单最暴力的方法,是用 O(n3)\tt O(原创 2021-11-05 19:29:07 · 510 阅读 · 0 评论 -
字典树 - trie树
trie树,也称字典树,大家有没有想过你们在字典里查找一个单词是怎么样的。首先,我们会查找第一个字符。然后在第一个字符的范围内,查找第二个字符…以此类推我们的字典树,就是这样的。前置知识字符串(都会?)算法用途快速搜索字符串算法复杂度时间插入,删除,查询长度为 len\tt lenlen 的字符串都是 O(len)\tt O(len)O(len)空间n次插入,最大长度len,有x个不同字符:O(min(x×len×n,xlen))\tt O(min(x \times len \tim原创 2021-11-05 19:15:34 · 108 阅读 · 0 评论 -
多模匹配-AC自动机
AC自动机 就是 trie+KMP\tt trie + KMPtrie+KMP前置知识trie\tt trietrie树失配指针算法用途多模式串匹配算法复杂度时间模式串数量 n\tt nn,平均长度 len\tt lenlen文本串长度 m\tt mm构建 trie\tt trietrie 树:O(n×len)\tt O(n \times len)O(n×len)构建失败指针:O(n×len)\tt O(n \times len)O(n×len)匹配:O(2×m)\tt O(2 \t原创 2021-11-05 18:50:39 · 134 阅读 · 0 评论 -
字符串处理-SA数组
后缀数组 SA\tt SASA 可以用于各方面字符串问题,其目的是求出这个字符串的所有后缀的按照字典序的排名。前置知识倍增 / DC3算法用途可以用来求最长公共子串,最长回文串等算法复杂度字符串长度为 n\tt nn时间O(nlogn)\tt O(n\log n)O(nlogn)空间O(n)\tt O(n)O(n)算法实现要知道,最暴力算法就是把所有后缀找出来,然后用 sort\tt sortsort 排序虽然时间复杂度和这个算法一样 O(nlogn)\tt O(n\log n原创 2021-11-05 18:46:23 · 279 阅读 · 0 评论