模板总结,学习笔记
文章平均质量分 66
常见模板
glorious_dream
生而无畏,战至终章
展开
-
子序列自动机 学习笔记
子序列自动机 学习笔记原创 2022-11-11 08:30:11 · 907 阅读 · 1 评论 -
cdq分治 学习笔记
cdq分治 学习笔记原创 2022-10-17 20:38:08 · 674 阅读 · 0 评论 -
反悔贪心 学习笔记
反悔贪心 学习笔记原创 2022-10-11 19:57:58 · 1604 阅读 · 0 评论 -
珂朵莉树 学习笔记
珂朵莉树 学习笔记原创 2022-09-29 17:10:31 · 735 阅读 · 0 评论 -
莫队 从零基础到入门 超详细
莫队算法 带修莫队 树上莫队 回滚莫队 树上带修莫队 知识点总结原创 2022-09-19 20:35:35 · 772 阅读 · 0 评论 -
后缀数组 学习笔记
后缀数组学习笔记原创 2022-09-15 18:35:55 · 577 阅读 · 0 评论 -
分块 学习笔记
分块学习笔记,数列分块入门原创 2022-09-08 14:39:09 · 444 阅读 · 0 评论 -
Kruskal重构树 学习笔记
Kruskal 学习笔记,NOI2018 归程原创 2022-09-05 08:27:13 · 170 阅读 · 0 评论 -
BSGS 学习笔记
BSGS 学习笔记原创 2022-09-04 09:51:06 · 273 阅读 · 0 评论 -
Miller-Rabin素数测试法 学习笔记
一般情况下判断一个数是不是质数时间复杂度是O(n),用Miller−Rabin素数测试法可以降低时间复杂度。原创 2022-09-01 21:53:03 · 180 阅读 · 0 评论 -
基环树(环套树) 总结
基环树(环套树) 总结原创 2022-08-16 19:34:50 · 3500 阅读 · 0 评论 -
换根DP总结
换根DP总结原创 2022-08-15 13:04:58 · 545 阅读 · 0 评论 -
可持久化线段树
可持久化线段树原创 2022-07-25 07:41:42 · 192 阅读 · 0 评论 -
二分图 二分图最大匹配
首先来说一下什么是二分图。二分图二分图又称作二部图,是图论中的一种特殊模型。设G=(V, E)是一个无向图。如果顶点集V可分割为两个互不相交的子集X和Y,并且图中每条边连接的两个顶点一个在X中,另一个在Y中,则称图G为二分图。性质当且仅当无向图G的每一个环的结数均为偶数时,G才是二分图。如果无环,相当于每个环的结点数为0,故也视为二分图。判断是否是二分图这里我们用到染色法,用两种颜色来染这个图。如果该节点的颜色是0,那么所有与其相邻的节点的颜色都是1。最后判断是否满足上述条件即原创 2022-05-29 18:51:11 · 554 阅读 · 1 评论 -
二分图带权最佳匹配 KM算法
题目大意:给定每一对男女之间的优势,求如何组合能让优势的总和最大。算法描述:首先可以看出来,这道题是一个带权的二分图匹配,KM算法的裸题。这个博客写的很好先来用自己的话简单的说一下。读入数据之后,需要把我们记录的数组先求好,也就是 表示女与男之间的优势,这个先处理好就可以。然后说算法的核心。首先,需要先知道二分图最大匹配。可以理解为中介帮你介绍房子的问题。给定两个集合,它们之间有一些边相连,但两个集合内部没有边相连,求最多能两个集合之间连多少条边。著名的匈......原创 2022-04-21 16:55:24 · 910 阅读 · 2 评论 -
平衡树 Splay
先写一篇Splay平衡树的博客吧(其它的还没学QAQ)。什么是平衡树首先需要知道二叉查找树,定义为该节点的左子树都比它的值小,右子树都比它的值大。这样有什么好处的?可以发现,中序遍历就是从小到大的顺序。然后Splay,个人理解,通过将某个节点旋转到根节点来调整这个树的高度,尽量保持平衡。如果树是这样的,很显然不平衡,我们需要通过操作让这棵树尽量平衡,也就是使树高尽量小。最后旋转到类似于下面的形状。关键操作:1.旋转分为左旋和右旋,要保证旋转完必须还得是......原创 2022-04-06 23:31:35 · 699 阅读 · 4 评论 -
Manacher算法
俗称马拉车算法,是用来求与字符串中的回文串有关的问题。用例题来说。算法过程一.预处理部分这里有一个很巧妙的地方,可以说是马拉车算法的精髓。1.考虑正常求回文串,很显然,需要分奇偶来考虑,奇回文串是一个对称中心,偶回文串中间是两个字符共同当对称中心(可以暂时这么理解吧,只可意会不可言传)。2.然后考虑马拉车算法怎么将其优化。现在有一个字符串,如果我们把它的每两个字符中间再插入一个字符(随便什么都行,本人习惯用$),并且在开头和结尾同时加上另两个字符(就比如前面加#,后面加@,只原创 2022-03-23 18:02:26 · 685 阅读 · 1 评论 -
单调队列 浅谈
队列一种先进先出的结构,具体可以用queue来实现,或者用数组模拟即可。单调队列什么是单调队列?顾名思义,就是让队列里的元素满足单调的特点,比如可以维护某一段区间里的最大值和最小值。引用一下某位大佬的话:如果一个选手比你小,还比你强,你就可以退役了,这句话很多单调队列都用得上。但现实可能有时就是这样(55555555)先用一道例题。可以用两个函数分别来求区间(窗口)里的最大值和最小值。#include<bits/stdc++.h>using name.原创 2022-03-20 00:33:02 · 204 阅读 · 1 评论 -
状压DP 学习笔记
首先来说一下状态压缩状态压缩就是使用某种方法,简明扼要地以最小代价来表示某种状态,通常是用一串01数字(二进制数)来表示各个点的状态。这就要求使用状态压缩的对象的点的状态必须只有两种,0 或 1;当然如果有三种状态用三进制来表示也未尝不可。使用条件1. 解法需要保存一定的状态数据(表示一种状态的一个数据值),每个状态数据通常情况下是可以通过2进制来表示的。这就要求状态数据的每个单元只有两种状态,比如说棋盘上的格子,放棋子或者不放,或者是硬币的正反两面。这样用0或者1来表示状态数据的每个单元,原创 2022-03-19 00:48:11 · 952 阅读 · 3 评论 -
AC自动机
什么是AC自动机? 能让你自动AC的代码?(显然不是)1.AC自动机是一种有限状态自动机(说了等于没说),它常被用于多模式串的字符串匹配。2.在学完AC自动机,笔者也总结出一句说了等于没说的话: AC自动机是以Trie的结构为基础,结合KMP的思想建立的。 (AC = KMP + Trie) 但不完全是。前置知识:KMP 和Trie。 (很重要)先说一下如何建AC自动机1. 基础的Trie结构:将所有的模式串构成一棵Trie树。2. KMP的思想:对Trie树上所有的结点构造失.原创 2022-03-17 00:05:41 · 7033 阅读 · 2 评论 -
数位DP 详解+模版
首先清楚数位DP要解决什么样的问题:求出在给定区间 [A,B] 内,符合条件 f(i) 的数 i 的个数。条件 f(i) 一般与数的大小无关,而与数的组成有关。由于数是按位dp,数的大小对复杂度的影响很小。用记忆化搜索来实现。先来看模板 dfs里面关键的几个变量(示题而定)1.pos 位数这个很好理解,就是位数,往下搜的时候把位数改变即可2.limit 最高位标记 什么意思? 比如要搜索1-555之间的数,如果最高位填5了,那么第二位的取值只有0-5,而最高位是1-4的时候,原创 2022-02-21 09:56:12 · 875 阅读 · 1 评论 -
IDA* 算法
IDA*算法是在A*算法的迭代加深A*算法主要用在bfs中,IDA*算法主要用在dfs中先来看一道IDA*的例题前置知识1:迭代加深定义: 每次限定一个maxdep最大深度,使搜索树的深度不超过maxdepfor(int maxdep=1;maxdep<=题目中给的最大步数;maxdep++){ dfs(0,maxdep);//0为出入函数中当前步数,maxdep为传入的最大深度。 if(success)break;//如果搜索成功则会在dfs函数中将succes..原创 2022-02-18 15:21:41 · 4859 阅读 · 1 评论 -
线段树 区间修改区间查询
维护序列的二叉树树上每个点对应序列上一段连续的区间ls/rs:k的左/右儿子Mid=(l+r)/2若点x对应[l,r],则ls对应[l,mid],rs对应[mid+1,r]根节点对应整个序列[1,n]叶节点对应的区间为[l,l],即序列上一个点1.区间加法考虑用lazy数组标记,当我们需要对点k所对应的区间加v时,我们不递归k的左右子树更新其内部值,而是选择lazy[k]+=v,代表这段区间已经加过v了。当我们在查询和修改中遇到一个有懒标记的点k时,由于其子树内部的值还未被更原创 2022-02-17 20:18:35 · 844 阅读 · 1 评论 -
最近公共祖先 LCA
概念子节点(儿子):一个节点含有的子树的根节点称为该节点的子节点;父节点(父亲):若一个节点含有子节点,则这个节点称为其子节点的父节点;根节点:没有父节点的节点;兄弟节点:具有相同父节点的节点互称为兄弟节点;祖先:父亲以及父亲的祖先;后代:儿子以及儿子的后代;子树:子节点及其后代构成的树节点的度:一个节点相连的点的个数称为该节点的度;叶节点:没有子节点的节点称为叶节点;节点的深度:从根到该结点的唯一路径的长度。树的高度或深度:树中节点的最大深度;森林:由m(m原创 2022-02-14 10:31:40 · 186 阅读 · 1 评论 -
tarjan 割点和桥
概念:割点:删去这个点,图的联通块个数增加桥:删去这条边,图的联通块个数增加点连通度:最小的点数使得删去之后图不连通边连通度:最小的边数使得删去之后图不连通如果一个图的点连通度大于等于2,那么图是点双连通的,边双连通同理点双:不存在割点/任意两点之前存在至少两条点不重复的路径边双:不存在桥/任意两点之前存在至少两条边不重复的路径点双/边双联通分量:无向图的极大点双/边双联通子图割点将图分割成若干个点双,桥将图分成若干个边双 桥不属于任何边双对于边(u,v),若low[原创 2022-02-14 10:19:27 · 338 阅读 · 1 评论 -
强连通分量 tarjan—scc
首先先说一下概念1.强连通:对于有向图中两点i,j,若存在i到j和j到i的路径,则称i,j强连通2.弱连通:对于有向图中两点i,j,若存在i到j或j到i的路径,则称i,j弱连通3.强连通图:任意两点均强连通的图4.弱连通图:任意两点均强连通的图5.强连通分量:有向图的极大强连通子图如何进行强连通分量缩点操作?考虑维护两个数组,dfn和low,分别表示该点的dfs序和该点通过树边和至多一条连向当前强连通分量内部的非树边能访问到的dfn最小值。 如果一个点的能访问到最早的点为这个..原创 2022-02-14 10:09:13 · 286 阅读 · 1 评论 -
最小生成树
Kruskal算法用并查集的一种贪心算法,先把每一个节点当作一棵生成树,按边权从小到大排序,每次枚举最小的边,看是否在同一棵树上#include<bits/stdc++.h>using namespace std;inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'|ch>'9'){if(ch == '-') f=-1 ; ch=getchar();} while(ch>='0'&a原创 2022-02-12 20:33:10 · 575 阅读 · 1 评论 -
图中最短路算法
1.Floyd由于算法时间复杂度是n^3的,一般不常用,但在无向图最小环中可以用到设f[i][j]表示i和j之间,经过k条边的最短路径 得到状态转移方程如下for(register int k(1) ; k<=n ; k=-~k){ for(register int i(1) ; i<=n ; i=-~i){ for(register int j(1) ; j<=n ; j=-~j){ f[i][j] = min(f[i][j],f[i][k]+f[k][j原创 2022-02-12 20:27:02 · 464 阅读 · 0 评论 -
集训 背包问题
1.01背包山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。最基础的一个背包,首先考虑状态转移,设dp[i][j]表示容量为j,放入前i个物品所得的最大价值很明显,如果还有剩余的话,dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])。然后考虑滚动数组压掉一维很明显,当前状态只能从前一个状态转来,所以可以去掉原创 2022-02-09 20:43:47 · 551 阅读 · 1 评论 -
矩阵快速幂 斐波那契数列
首先是矩阵乘法在矩阵乘法中满足以下运算律:1.(AB)C=a(BC) 2.(A+B)C=AC+BC 3.C(A+B)=CA+CB在普通的乘法中,一个数乘1还是等于它本身,在矩阵乘法中也有这么一个“1”,它就是单位矩阵不同于普通乘法中的单位1,对于不同矩阵他们的单位矩阵大小是不同的对于n∗mn*mn∗m的矩阵,它的单位矩阵大小为m∗mm*mm∗m,对于m∗nm*nm∗n的矩阵,它的单位矩阵大小为n∗nn*nn∗n也就是说单位矩阵都是正方形的,这是因为只有正方形的矩阵能保证结果和前.原创 2022-01-22 13:02:11 · 936 阅读 · 1 评论