学习笔记
文章平均质量分 75
pigonered
吾有一言,名之曰......
展开
-
学习笔记:2-SAT问题
前言最后一篇学习笔记了,之后就要咕咕咕很久了。在机房的最后一天,祝好。原理传送门luoguP4782解释一下题目:根据要求将布尔变量赋值,如1 1 3 0就是说要求将变量1为1或者变量3为0。由于每个布尔变量只有两个值1,0。我们可以将其拆开,由此我们发现:对于变量x,y,要求x或y要满足的值为a,b当a=1,b=1时,如果x=0,那么一定推出y必须为1,如果y=0,同理推出x=1。当a=1,b=0时,如果x=0,那么一定推出y必须为0,如果y=1,同理推出x=1。当a=0,b=1时,如原创 2021-11-19 08:32:01 · 347 阅读 · 0 评论 -
学习笔记:KMP字符串匹配算法
前言其实很早就学了,不过还是感觉很迷。但做到了NOIP2020的T2,只有学一下了。原理KMP是由3名数学家搞出来的算法,KMP也就是这3位的首字母。模板传送门luoguP3375首先看题目要求给定2个字符串,要求其中的一个字符串在另一个字符串里出现的次数。容易想到暴力:直接枚举2个串,如果不同,就将去匹配的串从头开始重新从匹配失败的位置继续找。最坏的时间复杂度是:O(nm)这个暴力算法叫做BF算法。我们发现这个算法最主要的问题是每次从头开始重新匹配,其实可以从其中的某个地方开始找,原创 2021-11-17 11:21:58 · 193 阅读 · 0 评论 -
学习笔记:树链剖分
前言树链剖分,将树的边划分为很多条链,由此降低对树上修改查询等的复杂度。本次介绍轻重链剖分。概念:重儿子:子树的节点最多的儿子,其中如果两个儿子的子树都相同,那么其中任意个。轻儿子:其余的儿子。重边:父亲到重儿子的边。轻边:其余的边。重链:节点到重儿子的路径。原理模板传送门luoguP3384分析:要对某一段链或子树进行修改和查询,容易想到使用线段树维护,那么我们应该如何将树进行分解,使得能在放到线段树上进行修改查询。这就要用到树链剖分。树链剖分我们通过2次DFS来分解。第一次原创 2021-11-10 21:34:28 · 229 阅读 · 0 评论 -
学习笔记:状态压缩DP
前言状态压缩DP,顾名思义,将每个状态进行压缩后进行DP,那么为什么可以压缩,怎样压缩?原理直接介绍比较抽象,我们来看一道例题。传送门luoguP1278分析:题目要求2个字符串的末尾和开头如果相等,即可合并,求最长的合并的字符串。观察发现字符串的范围≤16\leq 16≤16。暴力:直接DFS枚举所有的排列方式,不断更新答案即可。DFS时如果一个字符串能接上,打上标记,回溯回来后,取消标记。但是我们发现排列数是nnn的全排列,排列方式达到了n!n!n!!显然16的范围是无法满足的。于原创 2021-11-09 14:42:26 · 116 阅读 · 0 评论 -
学习笔记:求逆元的三种方法
前言对于模运算来说:(a+b)mod p=(amod p+bmod p)mod p(a+b)\mod p=(a\mod p+b\mod p)\mod p(a+b)modp=(amodp+bmodp)modp(a−b)mod p=(amod p+bmod p)mod p(a-b)\mod p=(a\mod p +b\mod p)\mod p(a−b)modp=(amodp+bmodp)modp(a×b)mod p=(amod p×bmod p)mod p(a\times b)\原创 2021-11-06 20:34:20 · 849 阅读 · 0 评论 -
数论学习笔记:积性函数,欧拉函数
积性函数定义定义在N+N^+N+上的函数称为数论函数。如果数论函数fff对于∀p,q∈N+\forall p,q\in N^+∀p,q∈N+满足gcd(p,q)=1gcd(p,q)=1gcd(p,q)=1有f(qp)=f(q)f(p)f(qp)=f(q)f(p)f(qp)=f(q)f(p)那么称为积性函数。如果对∀p,q∈N+\forall p,q\in N^+∀p,q∈N+有f(qp)=f(q)f(p)f(qp)=f(q)f(p)f(qp)=f(q)f(p)那么称为完全积性函数。定理:如果f原创 2021-11-05 18:27:05 · 270 阅读 · 0 评论 -
高等数学学习笔记2:微分,不定积分,定积分
前言Q:高等数学学习笔记1跑哪里去了???A:还没写,下次补发。其中会有一些我的理解,若不正确,感谢指出错误。理解这篇文章,需要三角函数,导数。微分微分在数学中的定义:由函数B=f(A),得到A、B两个数集,在A中当dx靠近自己时,函数在dx处的极限叫作函数在dx处的微分--百度百科我们去估计Δy\Delta yΔy的值,就是等于x0x_0x0处的切线斜率乘上Δx\Delta xΔx,即Δy=Δx×f′(x)\Delta y = \Delta x \times f^\prime(x原创 2021-11-04 14:58:37 · 1400 阅读 · 0 评论 -
学习笔记:分块
前言分块可以解决几乎全部的区间查询区间更新等问题,功能比线段树和树状数组要强大,但是时间复杂度会更大一点。其实分块就是一种优化过的暴力,它是对于整体进行像线段树一样的维护,对局部进行暴力的修改。原理顾名思义分块分块,我们把长度为n的序列分为若干块。维护块内信息即可。又要问了,要多大呢?通常将块的大小设为n\sqrt nn ,用pos数组储存每个块的位置。最后分完有剩,那么剩余的单独为一个块。我们用线段树的例题来介绍传送门luoguP3372题目要求:1.区间更新:我们找在这个区间有多少原创 2021-11-03 19:55:01 · 146 阅读 · 0 评论 -
学习笔记:网络流最大流
引入使得整个网络的流量最大的流函数叫做最大流。举个栗子,如图 (太丑了太丑了)边权表示容量。我们可以观察到:如果拆开了来看,4-5-3-7这条增广路最大流量是3,超过了相当于水管就爆了。2-5-3-7这条增广路最大流量是2,2-10这条增广路最大流量是2,如果合并起来看的话,发现4-5-3-7如果走了的话,那么最大流量是3,那么其他边的剩余流量就会减少,变成1-2-0-4,这样的话,我们发现2-5-3-7这条路就不能走了。而2-10是可以走的,变成了0-8这样最大流就是3+2=5了。原创 2021-10-29 10:39:03 · 114 阅读 · 0 评论 -
学习笔记:数位DP
引入数位dp,顾名思义,对数的每一位进行dp,具体我们来看题分析解决。原理传送门luoguP2657windy数此题就是一道非常标准的数位dp的题目,限制相邻位上的数字,要统计范围内的所有满足的数,如果暴力枚举肯定不够优美,那么我们对于每一位进行逐位逐位的确定,那么就能降低大量的复杂度。...原创 2021-10-26 17:20:48 · 97 阅读 · 0 评论 -
数论学习笔记:扩展欧几里得
欧几里得算法欧几里得算法:gcd(a,b)=gcd(a,a mod b)。我们可以用来求最大公约数gcd(a,b)用递归不断迭代,直到边界条件b=0后回溯。inline int gcd(int a,int b){ return b==0?a:gcd(b,a%b);}扩展欧几里得算法首先介绍裴蜀定理(Bezout定理)对于任何整数a,b,d=gcd(a,b),那么关于x,y的线性不定方程:当且仅当c是d倍数时,a*x+b*y=c有解(可能多个解)证明如下:我们使用数学归纳法证原创 2021-10-19 09:19:03 · 128 阅读 · 0 评论 -
学习笔记:DP优化单调队列优化
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar原创 2021-10-25 13:04:22 · 174 阅读 · 0 评论 -
学习笔记:有向图强连通分量的tarjan算法
概念强连通分量有向图强连通分量 :在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通 (strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图 。有向图的极大强连通子图 ,称为强连通分量。摘自百度百科我的理解就是在图的尽量大部分中,这部分中,从每个点出发,都可以回到该点,那么就是一个强连通分量。那么我们该如何找呢?原理找强连通的方法有两种算法Kosaraju算法和t原创 2021-10-24 18:59:20 · 212 阅读 · 0 评论 -
学习笔记:树的直径
概念在树上所有最短路径的最大值。原理这里介绍2种方法求树的直径。两次DFS(BFS)法我们任意从树上某个点出发,找到到它最远距离的点,然后再以这个点为起点,找到离这个点最远的点,这两点之间的距离即是树的直径。#include<bits/stdc++.h>using namespace std;#define ll long long const int N=1e5+5;int n,Max,p,dis[N];ll ans;int first[N],nex[N],to[原创 2021-10-21 17:25:46 · 221 阅读 · 0 评论 -
学习笔记:二分图的判定与匹配
引入二分图,可以分成两个子集,子集之间的每个点互不相连。二分图判定判定二分图通常使用染色法。从每个没有被染色的点出发,将自己染为一种颜色,将相邻的点染为另一种颜色,若染色时发现对面的点已经染成和自己相同的颜色,那么它就不是二分图。代码实现:#include<bits/stdc++.h>using namespace std;int n,m,col[205];int first[205],nex[405],to[405],tot;inline void add(int原创 2021-10-21 14:40:20 · 136 阅读 · 0 评论 -
学习笔记:LCA最近公共祖先
引入LCA即最近公共祖先,是指在有根树中2个点的最近的公共祖先。那么我们该如何求解?暴力:在一棵树中,每个点有一个深度,那我们先把一个较深的点跳到和另一个点深度相同的位置,然后一起跳,跳到它们在同一位置时,即为LCA。但是这种方法显然不优美,如果在一条链的2端,那么复杂度将会是O(n)。那么问题出在哪里呢?很明显一步一步的一起跳显然太慢了,如果我们能一次多跳几步,那么可以降下来了。原理基于倍增的思想,我们一次多跳几步。那该跳多少步?我们知道任意一个整数可以分为2的整数幂的和。因为每一个偶数肯原创 2021-10-20 20:17:09 · 255 阅读 · 0 评论 -
学习笔记:树形DP
引入顾名思义,在树上进行动态规划,所以首先要满足,是一棵树,然后观察是否满足DP的要求。我们来具体情况具体分析。例题题目大意:在一棵树上安插士兵,在节点上的一个士兵能看到所有与它相连的边,求最少安排的士兵能看到所有的路。满足是一棵树,而是求最小值。我们考虑用树形DP,对于每一个节点,只有2种状态,放与不放,那么我们用二维存储dp[i][j]表示i节点的状态1或0表示总的士兵数。状态转移:若该节点不放,那么它的子节点必须放。若该节点放,那么它的子节点可放可不放,取最小值即可。由于是一棵树,根节原创 2021-10-20 18:12:01 · 112 阅读 · 0 评论 -
学习笔记:四大背包问题详讲
今天介绍4种基本的背包,01背包,完全背包,多重背包,分组背包。01背包给一个容量m的背包,有n个物品,每个物品有w的重量和c的价值,求最大价值。我们枚举每个物品,再枚举背包的重量,用一维数组dp[m]表示当前重量下最大价值。注意;背包的重量需要逆推,才能使得装入的物品不重复,否则将会变成下面介绍的完全背包。核心代码;for(int i=1;i<=n;i++) for(int j=m;j>=w[i];j--) //逆推 dp[j]=max(d原创 2021-10-20 15:05:44 · 163 阅读 · 0 评论 -
学习笔记:Trie树详讲
引入假如我们给出大量的字符串,查询其中某两串的公共前缀,显然不断枚举比较是否相同的办法对于多次询问太慢了,这就要用到Trie树。Trie树即字典树,是一种能快速检索字符串的多叉树,但是Trie树的内存消耗很大,是用空间换时间的思想。那么它是如何实现的呢?原理假如给出abc,abd,abcd,bcd,efg五个字符串,先来看看构造出来的树。我们发现根节点是没有字符;第一字符不同在不同的子树上,而abc,abd第一字符相同就在同一子树上;而abc和abd由于最后一个字符不同,所以又分支了出去。原理十原创 2021-10-18 20:09:56 · 159 阅读 · 0 评论 -
学习笔记:RMQ问题ST表
引入RMQ问题是求一个区间的最大值问题,通常有很多的询问。那么我们要如何解决这种问题呢?暴力:当然可以O(nxm)n为个数,m为询问个数,显然不行。线段树:建树需要 O(logn)的时间,询问需要 O(logn)时间,线段树的算法是 O(nxlogn)+O(logn)的。Sparse Table(ST):它是一种基于倍增思想的算法,O(nxlogn)的预处理,O(1)回答每个询问,所以时间复杂度为 O(nxlogn)+O(m),空间复杂度为 O(nxlogn)。线段树的方法已经介绍,今天我们来原创 2021-10-17 14:26:18 · 88 阅读 · 0 评论 -
学习笔记:线段树基础和应用
引入如果我要不断访问一个区间的最大值,而且要不断更新点的值,那么树状数组就难办了。所以我们引入线段树这一数据结构来解决这些问题。线段树是基于分治思想的二叉树,是用来解决在线区间更改查询等问题的。让我们来了解一下它的原理吧。原理给出一个区间[1,5],我们将它二分,mid=(1+5)/2=3,左区间[l,mid]=[1,3],右区间[mid+1,r]=[4,5]。又将左区间二分,mid=(1+3)/2=2,左区间的左区间是[1,2],右区间是[2,3],又二分,直到分到l==r为止,以此类推,我们建原创 2021-10-17 13:27:32 · 125 阅读 · 0 评论 -
学习笔记:树状数组基础概念和应用
引入树状数组,顾名思义,像树一样结构的数。那它的作用是什么呢?我们知道前缀和,是一种非常高效且巧妙的思想,查询一个序列中的某一区间和[l,r],那么我们将可以预处理出[1,l-1],[1,r]的和,那么一相减便就得到[l,r]之间的和了。but,这只支持离线操作,如果我要不断的询问和修改的话,那么时间复杂度每次修改最坏就是O(n),所以就不行了,所以我们要引入了新的支持在线查询的东东——树状数组。它能以O(logn)的复杂度完成更新和查询。PS:树状数组能解决的问题,线段树都能解决,但有些问题线原创 2021-10-17 11:18:04 · 147 阅读 · 0 评论