![](https://img-blog.csdnimg.cn/20190927151026427.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Acwing算法基础
所有模板来源于Acwing
小桑要读研
这个作者很懒,什么都没留下…
展开
-
Huffman树、排序不等式、绝对值不等式、推公式
【代码】Huffman树、排序不等式、绝对值不等式、推公式。原创 2022-10-27 21:22:37 · 71 阅读 · 0 评论 -
区间问题(贪心)
【代码】区间问题(贪心)原创 2022-10-27 19:21:15 · 162 阅读 · 0 评论 -
区间dp问题
图中椭圆代表以左边那堆石子的最后一个来划分 右边至少是1堆 所以左边最多j-1。图中公式代表两堆石子合并时所使用的代价。原创 2022-10-26 18:51:26 · 58 阅读 · 0 评论 -
线性动态规划
【代码】线性动态规划。原创 2022-10-24 17:57:24 · 332 阅读 · 0 评论 -
最全背包问题
【代码】最全背包问题。原创 2022-10-23 10:07:40 · 68 阅读 · 0 评论 -
二分图(染色法、匈牙利算法)
二分图:顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。性质:一定不含有奇数环,可能包含长度为偶数的环, 不一定是连通图。原创 2022-10-22 10:24:09 · 129 阅读 · 0 评论 -
最小生成树(Prim普利姆算法、Kruskal克鲁斯卡尔算法)
其基本思想是:假设连通网G=(V,E),令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),概述图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点分别在T中不同的连通分量上,则将此边加入到T中;意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(Vertex ),且其所有边的权值之和亦为最小。),图论中的一种算法,可在加权连通图里搜索。堆优化版prim与Kruskal用于。堆优化版prim太麻烦 不用学 直接用。原创 2022-10-20 18:29:38 · 237 阅读 · 0 评论 -
Floyd
在priority_queue[HTML_REMOVED], greater[HTML_REMOVED] > heap;初始化dist, 松弛dist[x.b] = min(dist[x.b], backup[x.a]+x.w);注意连锁想象需要备份, struct Edge{inta,b,c} Edge[M];for n次循环 每次循环确定一个min加入S集合中,n次之后就得出所有的最短距离。初始化距离数组, dist[1] = 0, dist[i] = inf;将不在S中dist_min的点->t。原创 2022-10-16 20:19:40 · 258 阅读 · 0 评论 -
Bellman-Ford与spfa算法
是求含负权图的单源最短路径的一种算法,效率较低,代码难度较小。其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在 n-1 次松弛后还能更新,则说明图中有负环,因此无法得出结果,否则就完成。3.从起点开始枚举每个点的所有子节点,设父节点到子节点的距离为s,父节点到起点的距离为dist[u],子节点到起点的距离为dist[v],如果dist[u]+s原创 2022-10-16 18:03:16 · 461 阅读 · 0 评论 -
朴素版与堆优化版的Dijkstra算法
【代码】朴素版与堆优化版的Dijkstra算法。原创 2022-10-16 09:23:21 · 180 阅读 · 0 评论 -
BFS(宽度优先搜索、广度优先搜索)
算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。BFS算法常用于求最短路径或者求扩散性质的区域问题。(3)棋盘上某个棋子N步后能到达的位置总数。(2)数字按规则转换的最少次数。(5)图像中连通块的计算。(如果符合,将该点入队)。(初始化队列和所求的值)原创 2022-10-15 11:20:25 · 1238 阅读 · 0 评论 -
DFS(爆搜、深搜)
DFS俗称爆搜,深搜。DFS对应的流程是一个树的结构,DFS的精髓在于递归求解的思路以及回溯的处理。针对搜索的过程,又有重要的剪枝优化。必要的剪枝优化对DFS的顺序执行有很大的作用。DFS的过程就是沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当节点v的所在边都搜过,搜索回溯到发现节点v的那条边的起始节点。DFS使用的数据结构是栈,时间复杂度是O(n),DFS不具有最短性,也就是DFS搜到的路径不一定是最短路。原创 2022-10-13 21:17:32 · 555 阅读 · 0 评论 -
博弈论(NIM游戏、Mex运算、SG函数、有向图游戏)
所谓采取最优策略是指,若在某一局面下存在某种行动,使得行动后对面面临必败局面,则优先采取该行动。我们讨论的博弈问题一般都只考虑理想情况,即两人均无失误,都采取最优策略行动时游戏的结果。定义有向图游戏G,它的行动规则是任选某个有向图游戏Gi,并在Gi上行动一步。特别地,整个有向图游戏G的SG函数值被定义为有向图游戏起点s的SG函数值,即SG(G) = SG(s)。有向图游戏的某个局面必胜,当且仅当该局面对应节点的SG函数值大于0。有向图游戏的某个局面必败,当且仅当该局面对应节点的SG函数值等于0。原创 2022-10-09 17:08:57 · 464 阅读 · 0 评论 -
容斥原理的应用
S = 1个集合 - 2个集合交集 + 3个集合交集 + …+ (-1) ^ (n+1) * n个集合交集。证明:Cn0+Cn1+Cn2+...+Cnn=2^n 则Cn1+Cn2+...+Cnn=2^n-1。共有(2 ^ n) - 1项。原创 2022-10-09 11:26:18 · 165 阅读 · 0 评论 -
组合数(卢卡斯定理、卡特兰数)
不为质数 求逆元用。注意:如果mod为质数 求逆元快速幂。原创 2022-10-08 21:11:40 · 129 阅读 · 0 评论 -
高斯消元解线性方程组
【代码】高斯消元解线性方程组。原创 2022-10-08 11:06:07 · 62 阅读 · 0 评论 -
扩展欧几里得算法
裴蜀定理:对于任意正整数a,b 一定存在非零整数x,y使得ax+by=gcd(a,b)若ax+by=d 则d一定是a和b最大公约数的倍数。+r 可推出余数等于被除数减去商乘除数)原创 2022-10-06 20:28:00 · 78 阅读 · 0 评论 -
快速幂算法
【代码】快速幂算法。原创 2022-10-06 16:51:00 · 59 阅读 · 0 评论 -
欧拉函数的应用与推导
当i%pj==0时 例如i=8 pj=2时 i的质因子肯定包括pj 只需用i的质因子就行 在i里已经乘过(1-1/pj) (pj存的时质数)=0时 例如i=9 pj=2时 i的质因子肯定不包括pj本身 需要再乘一下(1-1/pj) (pj存的是质数)原创 2022-10-06 10:14:34 · 94 阅读 · 0 评论 -
约数||因数(约数个数、约数之和)
注 :把公式展开很好理解。最大公约数与最小公倍数。原创 2022-10-03 19:57:49 · 186 阅读 · 0 评论 -
质数||素数(分解质因数、筛素数、质数定理)
将2~n之间的正整数放在数组内存储,将数组中2之后的所有能被2整除的数清0,再将3之后的所有能被3整除的数清0 ,以此类推,直到n为止。i*i写法(n接近于int类型最大值时,i的平方原创 2022-10-03 14:34:17 · 302 阅读 · 0 评论 -
【哈希表】
【代码】【哈希表】原创 2022-09-21 22:39:52 · 74 阅读 · 0 评论 -
【手写堆】
head[]堆的一维数组 size堆的大小。以小根堆为例 如下图。原创 2022-09-17 17:43:22 · 74 阅读 · 0 评论 -
【并查集】
【代码】【并查集】原创 2022-09-16 20:28:43 · 62 阅读 · 0 评论 -
Trie树(字典树、单词查找树)
Trie树又称字典树、单词查找树。是一种能够高效存储和查找字符串集合的数据结构。原创 2022-09-16 17:42:54 · 331 阅读 · 0 评论 -
KMP算法
KMP算法的主要思想:每当一次匹配过程中出现字符不等时,不需要回退主串的指针,而是利用已经得到的前面"部分匹配"的结果,将子串向右滑动若干个字符后继续与主串中的当前字符进行比较。原创 2022-09-12 17:14:11 · 79 阅读 · 0 评论 -
单调栈与单调队列
【代码】单调栈与单调队列。原创 2022-09-10 19:41:02 · 101 阅读 · 0 评论 -
模拟栈与模拟队列
【代码】模拟栈与模拟队列。原创 2022-09-10 16:52:51 · 95 阅读 · 0 评论 -
数组模拟双链表
【代码】数组模拟双链表。原创 2022-09-09 16:05:26 · 306 阅读 · 0 评论 -
数组模拟单链表
数组模拟单链表。原创 2022-09-08 20:58:46 · 234 阅读 · 0 评论 -
区间和算法
【代码】【区间和】原创 2022-09-08 17:52:41 · 76 阅读 · 0 评论 -
区间合并算法
例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。给定 n个区间 [li,ri],要求合并所有有交集的区间。共一行,包含一个整数,表示合并区间完成后的区间个数。接下来n行,每行包含两个整数l和r。注意如果在端点处相交,也算有交集。输出合并完成后的区间个数。原创 2022-09-04 20:21:47 · 142 阅读 · 0 评论 -
位运算的应用
共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1 的个数。给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。操作:x & ( − x ) = x & (取反x + 1 )1、求n的二进制表示中第k位是几(个位为第0位)2、lowbit(x):返回x的最后一位1。①先把第k位移到最后一位 n > > k。0 ≤ 数 列 中 元 素 的 值 ≤。第二行包含 n 个整数,表示整个数列。操作:n > > k & 1。②看个位是几n & 1。原创 2022-09-04 20:12:09 · 201 阅读 · 0 评论 -
双指针算法
输入一个有单词组成的字符串(最前面没有空格),每个单词之间用一个空格隔开,输出每个单词。给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。第二行包含 nn个整数(均在 0∼105 范围内),表示整数序列。共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。第一行包含整数 n。原创 2022-09-04 16:43:10 · 80 阅读 · 0 评论 -
前缀和与差分算法
输入一个n行m列的整数矩阵,再输入q个操作,每个操作包含5个整数x1,y1,x2,y2,c 其中(x1,y1)和(x2,y2)表示一个子矩阵的左上角坐标和右下角坐标。输入一个 n 行 m 列的整数矩阵,再输入 q 个询问,每个询问包含四个整数 x1,y1,x2,y2表示一个子矩阵的左上角坐标和右下角坐标。接下来输入 m个操作,每个操作包含三个整数 l , r , c 表示将序列中 [ l , r ] 之间的每个数加上 c。接下来 m 行,每行包含三个整数 l , r , c 表示一个操作。原创 2022-09-03 12:10:01 · 83 阅读 · 0 评论 -
高精度算法
只有C++需要高精度,python长度默认无限大,java有大整数类。原创 2022-09-01 21:16:55 · 286 阅读 · 0 评论 -
二分查找(折半查找)
基本思想:找到查找区间的中间位置,用此位置上的值与待查找的值进行比较。若相等,则查找成功;否则,将查找范围缩小到半个区间,只在可能存在待查元素的半个区间进行查找。对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。共q行,每行包含两个整数,表示所求元素的起始位置和终止位置。给定一个按照升序排列的长度为n的整数数组,以及 q个查询。接下来q行,每行包含一个整数k,表示一个询问元素。如果数组中不存在该元素,则返回“-1 -1”。如果数组中不存在该元素,则返回“-1 -1”。...原创 2022-09-01 12:44:20 · 294 阅读 · 0 评论 -
归并排序算法
二路归并排序的基本思想:首先将待排序的n个记录看作n个长度为1的有序子表,然后从第一个子表开始对相邻的子表进行两两合并,接着再对合并后的有序子表继续进行两两合并,重复以上的合并工作,直至得到一个长度为n的有序表。将两个有序表合并成一个有序表的归并排序被称为二路归并排序,其它为多路归并排序。...原创 2022-09-01 10:44:04 · 306 阅读 · 0 评论 -
交换排序(冒泡、快速)
快速排序是目前最快的内部排序方法,其基本思想是:通过把数组中的某个记录放到表中恰当位置上,将原数组划分为两个子数组,同时对其他记录进行适当调整,使得前面数组中记录的关键字值均小于此记录的关键字值,后面数组中记录的关键字值均大于此记录的关键字值。接着再对两个子数组分别进行这样的操作,递归执行此过程,直到各子表长度都小于等于1,此时数据表就已经有序排列了。冒泡排序是一直比较相邻的两个元素,每比较一趟可以找出一个最大或最小元素并且放在最后一个位置。输出共一行,包含 n个整数,表示排好序的数列。...原创 2022-08-31 21:03:49 · 40 阅读 · 0 评论