- 博客(42)
- 收藏
- 关注
原创 背包模型总结
墨染空大佬的解答:在背包问题中,体积www与价值v是可以互逆的!可以将f[i]f[i]f[i]表示为体积iii能装的最大价值,也可以将f[i]f[i]f[i]表示为价值为iii所需的最小体积。两者等价,我们只需要选择范围较小的那维作为体积就可以了!这直接影响到时空复杂度。背包问题中 体积至多是 j ,恰好是 j ,至少是 j 的初始化问题的研究!!!一个大佬写的总结,太牛了,点击可看下面是他的原文章内容,借鉴下二维费用背包一道很好的例题:AcWing 1022. 宠物小精灵之收服这道
2022-03-31 15:20:55
1091
原创 最长上升子序列模型
模板题:AcWing 1017. 怪盗基德的滑翔翼(做两次二分的优化就行)AcWing 1014. 登山f[i][0]表示到第i个点,一直上升的最大长度f[i][0]表示到第i个点,一直上升的最大长度f[i][0]表示到第i个点,一直上升的最大长度f[i][1]表示到第i个点,有下降段的最大长度f[i][1]表示到第i个点,有下降段的最大长度f[i][1]表示到第i个点,有下降段的最大长度注意f[i][j]f[i][j]f[i][j]的转移方程,$f[i][1]f[i][1]f[i][1]的转移要
2022-03-26 18:00:12
1085
原创 数字三角形模型
模板题:AcWing 1015. 摘花生 \,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\, AcWing 1018. 最低通行费(这道题注意边界就行了)AcWing 1027. 方格取数这道题不是贪心走两次,因为两次局部最优不一定是全局最优,第一次会影响第二次,违背了DP的后无效性。同时走两条路,不相交即可!同时也要注意 KKK 不是步数,而是i+ji+ji+j的和。四种情况代表了i1i1i1和i2i2i2都可以从上或右转移过来,组合起来
2022-03-24 14:26:55
393
转载 扩展欧拉定理
前景回顾欧拉函数φ(n)表示1−N中,与N互质的数的个数\varphi(n)表示1 - N中,与N互质的数的个数φ(n)表示1−N中,与N互质的数的个数当a与m互质的时候有,aφ(m)≡1 mod (m)当a与m互质的时候有,a^{\varphi(m)}\equiv1\,\,mod\,\, (m)当a与m互质的时候有,aφ(m)≡1mod(m)特别的,当m为质数的时候,就变成了费马小定理特别的,当m为质数的时候,就变成了费马小定理特别的,当m为质数的时候,就变成了费马小定理欧拉函数总结扩展欧
2022-02-08 23:51:04
142
原创 C++实现内存“垃圾”回收机制
题目描述:当前我国计算机专业的数据结构与算法一般采用C++C++C++语言实现数据结构及相关算法(也有个别学校采用C语言实现数据结构及相关算法),但是C++C++C++及CCC语言由于采用指针的原因,程序员能灵活操作内存空间,也可能由于new/deletenew/deletenew/delete运算符(CCC语言一般采用malloc()/free()malloc()/free()malloc()/free()函数)使用不当导致内存泄漏,你是否可以在保留指针的情况下,设计一种“类C++类C++类C++”(比.
2022-01-14 14:55:15
2996
1
原创 KMP (持续更新中···)
KMP复杂度为 O(n)O(n)O(n)模板题链接:AcWing 831. KMP字符串这里ne[j]的大致意思是已经成功匹配了前j个字符#include<bits/stdc++.h>using namespace std;const int MAXN = 1e6 + 10;int n, m, ne[MAXN];char p[MAXN], s[MAXN];int main(){ cin >> n >> (p + 1) >>
2021-12-08 20:57:38
265
2
原创 AcWing-算法基础课总结
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar
2021-11-14 14:18:51
3464
原创 贪心问题总结
区间问题区间贪心问题一般是区间按照左端点或者右端点排序区间选点模板题链接:AcWing 905. 区间选点按照右端点排序,出现一个断点结果就+1借下大佬画的图:代码如下:#include<bits/stdc++.h>using namespace std;#define PII pair<int,int>int N,a,b;bool cmp(PII a,PII b){ return a.second<b.second;}int ma
2021-11-14 14:16:45
1194
原创 常见DP总结
此篇博客以例题为主线性DP数字三角形例题链接:AcWing 898. 数字三角形先画DP分析图我们从下到上枚举,这样就可以不考虑边界问题得到状态转移方程是:f[i][j]=max(f[i+1][j],f[i+1][j+1])+f[i][j]f[i][j]=max(f[i+1][j],f[i+1][j+1])+f[i][j]f[i][j]=max(f[i+1][j],f[i+1][j+1])+f[i][j]int main(){ scanf("%d", &n); fo
2021-11-14 11:14:58
704
原创 背包问题总结
01背包模板题:AcWing 2. 01背包问题解法:f[i][j]f[i][j]f[i][j] 表示只看前 iii 个物品,总体积是 jjj 的情况下,最大的总价值状态转移:1、不选第 iii 个物品,f[i][j]=f[i−1][j]f[i][j]=f[i-1][j]f[i][j]=f[i−1][j];2、选第 iii 个物品,f[i][j]=f[i−1][j−v[i]]+w[i]f[i][j]=f[i-1][j-v[i]]+w[i]f[i][j]=f[i−1][j−v[i]]+w[i];所
2021-11-13 11:05:14
512
原创 博弈论---Nim游戏
Nim 游戏先手必胜状态:可以走到某一个对方必败状态先手必败状态:无论怎么走,下一个状态都是对方必胜先给出结论:当a1a_1a1^a2a_2a2 ^a3a_3a3 ^⋅⋅⋅···⋅⋅⋅ ^an≠0时,先手必胜a_n\neq0时,先手必胜an=0时,先手必胜当a1a_1a1^a2a_2a2 ^a3a_3a3 ^⋅⋅⋅···⋅⋅⋅ ^an=0时,先手必败a_n=0时,先手必败an=0时,先手必败证明:当a1a_1a1^a2a_2a2 ^a3a_3a3 ^⋅⋅⋅···⋅
2021-11-12 16:23:59
2367
原创 容斥原理总结
容斥原理在计数时,必须注意没有重复,没有遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。∣S1⋃S2⋃S3∣=∣S1∣+∣S2∣+∣S3∣−∣S1⋂S2∣−∣S1⋂S3∣−∣S2⋂S3∣+∣S1⋂S2⋂S3∣|S_1\bigcup S_2\bigcup S_3|=|S_1|+|S_2|+|S_3|-|S_
2021-11-12 11:05:10
374
原创 求组合数(三种方法)
求组合数I(暴力做法)O(n)O(n)O(n)公式:Cab=Ca−1b−1+Ca−1b公式:C_{a}^{b}=C_{a-1}^{b-1}+C_{a-1}^{b}公式:Cab=Ca−1b−1+Ca−1b做法类似杨辉三角模板题:AcWing 885. 求组合数 I注意:当b等于0或者a==b的时候直接赋值为1代码如下:#include<bits/stdc++.h>using namespace std;const int MAXN=2010,mod=1e9+7;int
2021-11-12 00:39:59
2171
原创 高斯消元解线性方程组
对于下面这个方程组对于下面这个方程组对于下面这个方程组{a11x1+a12x2+⋅⋅⋅+a1nxn=b1a21x1+a22x2+⋅⋅⋅+a2nxn=b2 ⋅⋅⋅an1x1+an2x2+⋅⋅⋅+annxn=bn\begin{cases}a_{11}x_1+a_{12}x_2+···+a_{1n}x_n=b_1\\a_{21}x_1+a_{22}x_2+···+a_{2n}x_n=b_2\\\,\,\,\,\,\,\,\,
2021-11-11 19:55:40
306
原创 中国剩余定理
中国剩余定理对于 nnn 个两两互质的数 m1,m2,⋅⋅⋅mn \,\,m_1,m_2,···m_n\,\,m1,m2,⋅⋅⋅mn,那么对任意的整数:a1,a2,⋅⋅⋅,ana_1,a_2,···,a_na1,a2,⋅⋅⋅,an,存在一个 xxx 是以下方程组的解x≡a1 ( mod m1)x\equiv a_1 \,(\,mod\,\, m_1)x≡a1(modm1)x≡a2 ( mod m2)x\equiv a_2 \,(\,mod\,\, m_2)x≡a2(modm
2021-11-11 18:13:18
1066
原创 扩展欧几里得算法
裴蜀定理:有任意正整数 a,b\,a,ba,b,那么一定存在非零整数 x,yx,yx,y 使得 ax+by=(a,b)ax+by=(a,b)ax+by=(a,b)扩展欧几里得解决的问题:对于一组数 ai,bia_i,b_iai,bi,求出一组 xi,yix_i,y_ixi,yi 使得 ai∗xi+bi∗yi=gcd(ai,bi)a_i*x_i+b_i*y_i=gcd(a_i,b_i)ai∗xi+bi∗yi=gcd(ai,bi)模板题链接:AcWing 877. 扩展欧几里得算法.
2021-11-11 16:19:57
161
原创 快速幂(快速幂的做法,快速幂求逆元)
快速幂 O(logn)\,\,O(logn)O(logn)顾名思义,快速幂就是快速算底数的 nnn 次幂。其时间复杂度为O(log₂N)O(log₂N)O(log₂N), 与朴素的 O(N)O(N)O(N) 相比效率有了极大的提高。快速求出 ak mod pa^k\,mod\,pakmodp 的结果,时间复杂度为 O(logk)\,O(logk)O(logk),核心思想就是反复平方模板题:AcWing 875. 快速幂核心代码如下:ll qmi(ll a,ll k, ll p){
2021-11-11 15:06:07
272
原创 欧拉函数总结
欧拉函数 O(n)\,\,\,O(\sqrt{n})O(n)1∼N1∼N1∼N 中与 NNN 互质的数的个数被称为欧拉函数,记为 ϕ(N)ϕ(N)ϕ(N)若在算数基本定理中,N=p1a1∗p2a2…pmamN=p_1^{a1}*p_2^{a_2}…p_m^{a_m}N=p1a1∗p2a2…pmam,则:ϕ(N)=N×p1−1p1×p2−1p2×…×pm−1pmϕ(N) = N×\frac{p_1−1}{p_1}×\frac{p_2−1}{p_2}×…×\frac{p_m−1}{p_m
2021-11-11 12:00:33
299
原创 约数(试除法求约数,约数个数,约数之和,最大公约数)
试除法求约数 O(n)O(\sqrt{n})O(n)需要注意的是如果一个数是平方数的话需要特判一下只加一个进去模板题:AcWing 869. 试除法求约数核心代码如下:for(int i = 1; i <= a / i; ++i){ if(a % i == 0) { ans.push_back(i); if(i != a / i) ans.push_back(a / i); }}约数个数N=p1a1∗p
2021-11-11 11:00:41
317
原创 质数(试除法,分解质因数,筛质数)
判断是不是质数质数的判定------试除法 O(n)O(\sqrt{n})O(n),其实是[logn,n]其实是[logn,\sqrt{n}]其实是[logn,n]for循环里面的判断条件一定要写成for(int i = 2; i <= a / i; ++i),如果是i*i<=a,那么对于判断较大的数的时候会溢出核心代码:bool isPrime(){ if(a < 2) return false; for(int i = 2; i <=
2021-11-11 00:04:12
444
原创 二分图总结
把一个图的顶点划分为两个不相交子集 ,使得每一条边都分别连接两个集合中的顶点。如果存在这样的划分,则此图为一个二分图。如果集合 u 或 v 内部存在边则不是二部图染色图判定二分图...
2021-11-10 14:15:37
365
原创 最小生成树(Prime和Kruskal)
最小生成树有 nnn 个顶点,用 n−1n-1n−1 条边把一个连通图连接起来,并且使得权值的和最小的树就是最小生成树。primprimprim 算法采用的是一种贪心的策略。每次将离连通部分的最近的点和点对应的边加入的连通部分,连通部分逐渐扩大,最后将整个图连通起来,并且边长之和最小。与 DijkstraDijkstraDijkstra类似,PrimPrimPrim 算法也可以用堆优化,优先队列代替堆,优化的 PrimPrimPrim 算法时间复杂度 O(mlogn)O(mlogn)O(mlogn)
2021-11-05 00:56:37
315
1
原创 Floyd(多源最短路---包含多个源点)
FloydFloydFloyd用邻接矩阵来存储所有的边,原理是基于动态规划,可以访问任何两个点之间的最短距离。而 dijkstra,spfadijkstra,spfadijkstra,spfa 只能访问每个点到特定点的最短距离核心代码就三重循环:d[i,j]d[i,j]d[i,j]存储的是i→ji→ji→j的最短路,dijkstradijkstradijkstra是稀疏矩阵存图,另开一个 distdistdist 数组存最短距离,而 FloydFloydFloyd 是稀疏矩阵存图,.
2021-11-04 20:25:36
180
原创 Spfa算法(可以求有负权的图)
SpfaSpfaSpfaspfaspfaspfa 通常用于求含负权边的单源最短路径,以及判负权环。spfaspfaspfa 最坏情况下复杂度和朴素 Bellman−FordBellman-FordBellman−Ford 相同,为O(VE)O(VE)O(VE)。spfa求最短路spfa求最短路spfa求最短路spfaspfaspfa是Bellman_fordBellman\_fordBellman_ford算法的优化。优化的是:dist[b]=min(dist[b],dist[a]+w)dist.
2021-11-04 18:17:30
334
原创 bellman-ford (有边数限制的最短路,可能存在负权路)
最短路径中不能包含负权回路,有负权回路的边可能不存在最短路。因为每次经过负权回路,路径的权值会减少。有些图结构中会存在负权边,用于表达通过某条途径可以降低总消耗,在有向图中,负权边不一定会形成负权回路,所以在一些计算最短路径算法中,负权边也可以计算出最短路径;在无向图中,负权边就意味着负权回路,所以无向图中不能存在负权边。作者:zhipingChen链接:https://www.jianshu.com/p/b876fe9b2338来源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载..
2021-11-04 17:10:44
174
原创 Dijkstra(持续更新中···)
Dijkstra(迪杰斯特拉算法)在给定不带负权的有向图中,求两点间的最短路(无向图可以看成特殊的有向图)朴素版的dijkstra算法 (O(n2))(O(n^2))(O(n2))int arr[510][510], dis[510], flag[510];arr是稀疏矩阵存图,最开始把所有的值设置为正无穷,一般是稠密图—稀疏矩阵来存步骤如下:1、初始化距离数组dist,dist[1]=0,因为第一个点到第一个点的距离为 0,第一步只有起点被遍历到了。其他的点 i 初始化为正无穷
2021-11-04 12:26:13
199
原创 拓扑排序(持续更新中···)
拓扑排序对一个有向无环图 GGG 进行拓扑排序,是将 GGG 中所有顶点排成一个线性序列,使得图中任意一对顶点 uuu 和 vvv ,若边 <u,v>∈E(G)<u,v>∈E(G)<u,v>∈E(G) ,则 uuu 在线性序列中出现在 vvv 之前。针对有向无环图,有向无环图一定存在拓扑序列,故有向无环图可以成为拓扑图。一个有向无环图一定存在一个入度为0的点无向图和有环图都没有拓扑排序模板题:AcWing 848.有向图的拓扑序列思路:每次只向队列里面加入
2021-11-04 10:54:51
128
原创 深度与广度优先搜索(DFS&&BFS) (持续更新中···)
深度优先搜索(以下简称DFS)DFS其实可以看成递归,其过程简要来说可以是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只访问一次。常用来处理走迷宫等问题⋅⋅⋅···⋅⋅⋅每次回溯的时候记得要恢复状态!!!经典例题:AcWing 842.排列数字AC核心代码:DFS(cnt+1)DFS(cnt+1)DFS(cnt+1)之后一定要恢复现场,即flag[i]=falseflag[i]=falseflag[i]=falsebool flag[10];int path[10];void
2021-11-03 15:48:58
315
原创 AcWing算法基础课 哈希表(持续更新中···)
哈希表(HashHashHash表、散列表)散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。模板题链接:AcWing 840.模拟散列表拉链法(用个链表来存储每个位置上的集合)AC核心代码:要记得把h数组全部赋值为-1。这里N为大于100000的第一个质数,用质数来说相对比较好,能最大限度减少冲突const int N = 1e5 + 3;int h[N], e
2021-11-02 18:00:31
456
原创 AcWing 堆排序 (持续更新中···)
堆排序由一颗完全二叉树组成。小根堆:每个节点的值都小于等于它的左右儿子节点的值,根节点是最小的值大根堆:每个节点的值都 大于等于它的左右儿子节点的值,根节点是最大的值堆的功能(以手写的小根堆为例)1、插入一个数2、求集合中的最小值3、删除最小值4、删除任意一个元素5、修改任意一个元素PSPSPS:用 sizsizsiz 来维护当前堆的大小,每进行一次删除操作都要 siz−1siz-1siz−1。另外,数组是以 111 开始的,所以 kkk 节点的左子树是 2∗k2*k2∗k ,右子树
2021-11-02 17:35:04
305
原创 AcWing 算法基础课 并查集(持续更新中···)
并查集处理多个元素的集合问题,主要解决元素分组问题,支持合并和查询两种操作。原理是一个集合是一棵树,根节点就是所有儿子的祖宗。模板题链接:AcWing 836.合并集合初始化:最开始每个点都是一个集合,一般把每个集合初始为它本身。一般用并查集这种数据结构的时候,最开始就要把它初始化,时间复杂度为O(n)O(n)O(n),模板代码如下void init(){ for(int i=1;i<=n;++i) p[i]=i;}返回元素x的祖宗结点---find()函数,注意根节点一定有
2021-11-02 00:39:20
895
原创 AcWing 算法基础课 Trie树(字典树、前缀树)总结
Trie树Trie树又称字典树,前缀树。是一种可以高效查询前缀字符串的树,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。`做题看到大量字符串或者大量字符就往Trie树或者哈希这边想,因为速度很快Trie树功能:1、插入:向字符串集合插入字符串2、查询:查询某个字符串是否在该字符串集合中(可以在字符串末尾的字符上打上一个标记)3、统计次数:
2021-11-01 22:58:53
561
原创 单链表 (持续更新中···)
单链表模板题:AcWing 826.单链表head 表示头结点的下标e[i] 表示节点i的值ne[i] 表示节点i的next指针是多少idx 存储当前已经用到了哪个点#include <iostream>using namespace std;const int N = 100010;// head 表示头结点的下标// e[i] 表示节点i的值// ne[i] 表示节点i的next指针是多少// idx 存储当前已经用到了哪个点int head, e[N], ne
2021-10-31 21:49:10
103
原创 单调栈与单调队列
单调栈单调递增的栈或者单调递减的栈应用场景一般为求一个序列里的某个数,左边或者右边离它最近的比它小或者比它大的第一个数模板题:AcWing 830.单调栈模板代码:#include<bits/stdc++.h>using namespace std;const int MAXN = 1e5 + 10;int arr[MAXN],N,x;int main(){ scanf("%d",&N); arr[0]=-1; int top=0;
2021-10-31 20:37:04
196
原创 AcWing 算法基础课 离散化(持续更新中···)
离散化一些题目的数据跨度很大,用数组按顺序来存储这些数很浪费空间,有时数组容量还不够(比如1e9),此时就需要离散化处理。改变相对数据之间的相对大小,将其一一映射到数组中。求出一组数中某个数是第几大比如,有一组数据{19,19,888,45,−46,1,56431,0,87,45,119,19,888,45,-46,1,56431,0,87,45,119,19,888,45,−46,1,56431,0,87,45,1}求出每一个数是第几大,可以先把他们放进一个vectorvectorvector,
2021-10-31 18:33:36
379
原创 AcWing 算法基础课 位运算 (持续更新中···)
位运算因为计算机内部的运算都是基于二进制的,所以位运算一般都比其他运算快符号名称运算规则&与同时为1才为1,有一个0就是0|或同时为0才是0,有一个1就是1
2021-10-30 17:33:41
273
原创 AcWing 算法基础课 双指针(持续更新中···)
双指针可分为快慢指针、对撞指针(也叫左右指针),滑动窗口双指针即用两个指针来维护,一般可以将O(n2)O(n^{2})O(n2)的时间复杂度降低到O(n)O(n)O(n)快慢指针有两个指针,这两个指针移动速度不同,一般来说当指针移动到末尾或两指针相遇(环问题)即结束模板题:AcWing 799. 最长连续不重复子序列AcWing 2816.判断子序列对撞指针两指针最开始分别在开头和结尾,相遇即结束,一般用在有序序列,最经典的就是二分查找了模板题链接:AcWing 800.数组
2021-10-30 10:09:10
237
原创 AcWing 算法基础课 前缀和&&差分 总结(持续更新中···)
前缀和通过预处理,可以在O(1)的时间复杂度内询问特定区间内所有元素的和一维前缀和原数组:a[1]a[1]a[1],a[2]a[2]a[2],a[3]a[3]a[3],a[4]a[4]a[4]···前缀数组:s[1]s[1]s[1],s[2]s[2]s[2],s[3]s[3]s[3],s[4]s[4]s[4]···s[1]=a[1]s[1]=a[1]s[1]=a[1]s[2]=a[1]+a[2]s[2]=a[1]+a[2]s[2]=a[1]+a[2]s[3]=a[1]+a[2]+a[3]s
2021-10-28 21:04:15
329
原创 AcWing 算法基础课 二分总结 (持续更新中···)
二分包括二分查找和二分答案二分查找二分查找分为整数二分和浮点数二分。其实二分和单调性关系不是绝对的,但是二分是永远基于单调性的,可以总结为有单调性的一定可以二分,而能二分的不一定具有单调性,点击这里参考这道题,LeetCode里面有很多非单调用二分查找的整数二分—需要考虑边界整数二分需要考虑边界问题,大佬yxc总结的两个万能模板,永远不会错,如下模板一:如果更新方式是l=mid+1,r=midl=mid+1,r=midl=mid+1,r=mid,即答案尽量往左边找,那么midmidmid的更
2021-10-28 16:06:03
777
原创 AcWing 算法基础课 排序总结(持续更新中······)
本博客只基于AcWing刷题总结,话不多说,先上总图快速排序题目链接:AcWing 785.快速排序快速排序思想:主要思想是分治。先任意取一个数x(一般取区间中间那个数),然后把小于x的数放在x的左边,大于x的数放在x的右边,然后依次递归下去,最后得到的就一定是有序的。(PS:快排最差时间复杂度为O(n2)O(n^{2})O(n2)。AC代码如下:#include<bits/stdc++.h>using namespace std;const int MAXN = 1e5 +
2021-10-28 09:47:09
601
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人