
算法学习记录
文章平均质量分 90
各种初级算法
2301_78981471
这个作者很懒,什么都没留下…
展开
-
计数类Dp
我们可以用完全背包的思想来做:在前 i 件物品中,选出若干件,使其和正好为 j。然后根据完全背包的优化思路将其压缩至一维即可。原创 2024-03-14 20:05:53 · 331 阅读 · 0 评论 -
简单区间DP
区间Dp指的是某些问题可以用区间来划分解决。原创 2024-01-30 21:23:41 · 956 阅读 · 0 评论 -
简单线性Dp
处理起来是线性的(???原创 2024-01-30 20:01:37 · 737 阅读 · 0 评论 -
简单背包问题
01背包就是指问题:从NNN件物品中选出kkk件放入容量是VVV的背包中,最终答案具有某种属性(价值最大/最小/物品数量最多…),而且每种物品只能选一次。我们可以看出,其实动态规划就是把每一种可能滚了出来,然后选取符合要求的那一个解。与01背包类似,唯一区别就是物品数量无限。附加条件:每件物品限制个数,且个数不一每一次选则一个组别里面的某一个元素。现在是选不选,选的话选组里面的哪个?原创 2023-12-18 21:57:27 · 1076 阅读 · 0 评论 -
容斥原理的并
画了图,清晰易懂,懒得打字了。SS1S2S3−S1∩S2−S1∩S3−S2∩S3S1∩S2∩S3SS1S2S3−S1∩S2−S1∩S3−S2∩S3S1∩S2∩S3我们可以把这个式子推导到nnn维,奇加偶减。原创 2023-12-17 21:29:26 · 904 阅读 · 0 评论 -
求组合数的四种方法以及卡特兰数
从网格图的左下走到右上,只能往右往上走,而且往上走的步数不能超过往右走的步数,也就是路线不能超过绿线,那么所有的走法就是卡特兰数。原创 2023-12-17 19:30:17 · 1077 阅读 · 0 评论 -
中国剩余定理CRT
孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?这就是经典的剩余定理问题,也是我们小学题目:三个三个数余二,五个五个数余三,七个七个数余二,求这个数是几?思路就是:先读入一个式子,然后以这个式子为基准,再读入一个式子,找他们的通解,将式子更新为他们的通解,然后再读入,继续找通解,直到读完。真的nm太抽象了吧,这玩意儿是人学的?我选择直接背,以我的水平考到了也做不出来。用于求模数两两互质的线性同余方程组,若不互质则不存在解。,求个模找最小即可。原创 2023-12-17 13:51:23 · 2130 阅读 · 0 评论 -
扩展欧几里得算法与线性同余方程
既然已经得到了递推式,我们可以直接递归来求系数,递归终点就是。为任意整数,所以只能让两个括号内的项为。而扩展欧几里得算法就是来求这个系数。的倍数,那么证明有解,系数。也要成倍数增加,倍数就是。原创 2023-12-15 16:23:27 · 924 阅读 · 0 评论 -
欧拉函数与欧拉定理
对于范围内的每个数都求欧拉函数,肯定不能用定义法一个一个求,这样时间复杂度为。,我们可以用线性筛筛出质数再计算质因数,时间复杂度为。按照分解质因数的逻辑挨个得到质因数,然后累乘即可。复杂度瓶颈在于分解质因数,所以是。,欧拉函数是小于或等于。互质的数的数目,记作。原创 2023-12-12 17:36:58 · 1092 阅读 · 0 评论 -
约数性质以及辗转相除法
基于算术基本定理,从最小质数开始往上除,直到不含这个因数,而和数都是由比它小的质数相乘得来,所以所有约束都是质数。这个公式展开就是每项约数的和。原创 2023-12-12 11:43:56 · 807 阅读 · 0 评论 -
质数之试除法与质数筛
对于小于等于111的数来说,都不是质数;对于大于111的数来说,因数只有111和它本身的数就称为质数。原创 2023-12-10 21:35:02 · 987 阅读 · 0 评论 -
最小生成树算法与二分图算法
PrimPrimPrim跟DijkstraDijkstraDijkstra算法很相近,都是每个点轮一遍然后贪心找最小值,同样,PrimPrimPrim也可以用堆优化,但是不如KruskalKruskalKruskal算法,所以不用。g[][]邻接矩阵存边,st[]用于标记那些节点在生成树中,dist[]存储每个节点到生成树的最小距离。首先,初始化每个点到生成树的距离,在一开始,除了根节点是000,其他都是INFINF。原创 2023-12-02 23:08:58 · 985 阅读 · 0 评论 -
最短路算法
采用了动态规划思想,具体怎样我也不知道 >_<,没学过呜呜呜。总之很短很暴力。别问,问就是背过菜就多练,学不会就背过。暴力是暴力,FloydFloydFloyd是FloydFloydFloyd。你要是一直拿FloydFloydFloyd当暴力。你咋不去自己写一个?原创 2023-12-01 21:58:30 · 988 阅读 · 0 评论 -
Trie字典树
一种树结构,用来存储字符串,能够查询某字符串是否存在一般题目中都会说明是全大写字母或者全小写字母,所以说数组开的范围不会太大,当然也有大范围。(我在写啥???《-_-》)板子题:https://www.acwing.com/activity/content/problem/content/883/解释一下 insert()insert()insert() 函数首先读入了待插入的字符串找到根节点 rootrootroot —> ,也就是在位置是我们的根节点位置,由这个位置往后寻找先读入下一个字符原创 2023-11-30 14:29:35 · 838 阅读 · 0 评论 -
区间合并笔记
区间合并是指给定多个区间,让你将重合的区间合并为一个区间。原创 2023-11-30 10:00:53 · 474 阅读 · 0 评论 -
离散化笔记
大,但是我问他是因为键有序所以导致哈希表映射后相对顺序不变吗,它又说不是,然后就是一堆我看不懂的谜语,一直复读复读复读,啊啊啊啊啊啊啊好痛苦啊啊啊啊啊啊。其实由上述过程和代码我们可以发现,我们用数组来缩小数域的思路与哈希表不谋而合,所以说我们可以用哈希表来存我们的操作数的序列号,这样的话能将二分的。是较小的,而数据的编号很大,所以就可能出现我们映射的范围出现问题,例如一个区间。,真的很烦啊,想不出来为什么,等我以后深入一下。,也就是说,我们将零散的数域变得紧凑。,这个时候我们有个尴尬的问题,我们的。原创 2023-11-29 23:02:26 · 1137 阅读 · 0 评论 -
简单位运算
111lowbitxx−xlowbitxx−x最终得到一个111后面跟着一串000评论区dalao的方案。原创 2023-11-29 19:31:19 · 834 阅读 · 0 评论 -
双指针算法
大致有两种情况对于两个序列,我们需要对里面的某些值进行操作更多的时候是对一个序列来说,我们需要对前后两个值进行操作这些时候,我们就需要用两个指针去寻找满足条件的两个值。原创 2023-11-27 23:51:15 · 906 阅读 · 0 评论 -
前缀和与差分
差分其实是前缀和的逆运算,我们假想有一个数组。函数,非常巧妙啊,尤其是在读入阶段对。的元素进行加减操作时,如果采用遍历。对其优化可以使时间复杂度降到。那我们插入函数该怎么写呢?整个差分数组的精髓就在于。原创 2023-11-27 22:20:42 · 835 阅读 · 0 评论 -
KMP算法
对于一长段字符串和一个模版串,我们想查找字符串是否包含模版串,通常方法是暴力枚举每个字符。KMPKMPKMP在暴力基础上优化,如果模版串的前后缀相同,那么直接将模版串移过来再继续往后匹配。原创 2023-11-25 21:20:45 · 903 阅读 · 0 评论 -
并查集笔记
对于并查集来说,基本操作就是find(),但是解决复杂问题关键就在于额外维护一些值。计算连通块中节点数,维护的是size[]数组,在对并查集进行合并操作时维护。食物链1,维护的是到根节点距离,在find()时维护,利用了DFSDFSDFS。食物链2,维护的是三个并查集,在合并时维护。在计算连通块节点数时,为什么不在find()进行DFSDFSDFS时进行统计,反而另外开一个数组进行记录呢?在之前的树于图的深度优先遍历中,我们只用了DFSDFSDFS。原创 2023-11-12 14:47:50 · 66 阅读 · 0 评论 -
拓扑排序TopSort
的节点入手,将其删除,不断重复此操作,直到结束,如果有节点剩余则说明有环。个节点,我们从任一节点入手往上找他的入度,如果都能找到,那必然有。个节点,由抽屉原理可得,必然有环,所以所有点入度不为。反证法得:有向无环图必然存在一个入度为。拓扑排序能够判断一个。原创 2023-11-09 00:07:24 · 85 阅读 · 0 评论 -
树与图的深度与广度优先遍历
我们存储有向图一般用邻接矩阵,就是一排挨着的链表,每个链表的头节点是一个节点,由这个节点指向了后面链中的每个节点。如果是无向图,那么我们需要存两次,即有向边(a, b)和有向边(b, a)。原创 2023-11-08 22:48:27 · 63 阅读 · 0 评论 -
广度优先搜索BFS及其经典例题
BFS用队列结构来进行层级遍历,先把初状态入队,然后不断出队,把出队元素的后续状态入队,直到找到答案。因为是层级遍历,所以第一次出现的答案就是最近的答案,也就是最短路问题。它跟DFSDFSDFS一样,是一种思路,没有固定模板。原创 2023-11-07 23:16:03 · 182 阅读 · 0 评论 -
深度优先搜索DFS(递归)
DFSDFSDFSif(边界条件){return;i < n;++i){if(满足条件){进行赋值操作等;dfs(u + 1);进行下一步递归将之前的赋值操作还原;原创 2023-11-06 23:04:00 · 98 阅读 · 0 评论 -
单调栈与双向队列
但是我们如果读入到一个比之前入队一部分数还小的数,那么他们就又可以滚了,因为这个数的序号比他们靠后,值也比他们小,所以只要他在一天,前面那些数就永无出头之日,而等当前读入的数滑出窗口时,前面那些数早就滚了,所以直接全部弹出。首先我们要明白一点,需要找到比它小的数,那么比它大的数就不用入栈了,因为不可能是答案;如果我入栈的这个数比之前入栈的某一部分数还要小,那么那一部分就可以滚了,因为当前入栈的数比他们都小,只要这个数还在一天,他们就不可能是答案,而删掉这个数的可能只有一个:来了一个更小的数。原创 2023-11-05 22:50:49 · 73 阅读 · 0 评论 -
单链表和双链表
我们用一个数组存值,一个数组存下一个元素的索引,一个数组存头节点。既然单链表只能找到下一个节点位置,那我们能不能设计一个双链表,使其。,代表表头与表尾,只不过他们没有值,表头表尾互相指向彼此,于是。当我们想找第一个元素,就找表头的右边第一个。其实就是我们往里面插入了俩元素,序号为。原创 2023-11-05 21:36:40 · 40 阅读 · 0 评论 -
哈希表与字符哈希
由于之前的查找有些耗时多,有些需要多做预处理,那么有没有方法能让查找效率变得非常高呢?哈希表,这是一个全新的数据结构,能让查询的时间复杂度变为O1O(1)O1。总的来说,我们就干了这么些事:处理数据得到编号,拿着编号去对应坑位,如果那个坑位有人,我就去下一个,直到走到最后,由于前面的还没找过,所以瞬移到第一个位置继续找空坑位。原创 2023-11-02 23:50:46 · 56 阅读 · 0 评论 -
高精度加减乘除
大数 * 大数 并不常用,但是思路可借鉴加法和乘法。,内个同样用不太到。原创 2023-10-31 20:09:42 · 56 阅读 · 1 评论 -
快速幂与求逆元
ab≡a∗xmodnab≡a∗xmodna≡a∗x∗bmodna≡a∗x∗bmodn消去aaax∗b≡1modnx∗b≡1modn如果nnnbn−1≡1modnbn−1≡1modnbn−2≡1modnbn−2≡1modn欧拉定理。原创 2023-10-30 16:03:32 · 123 阅读 · 1 评论 -
堆及其五种操作以及模拟堆
down。原创 2023-10-28 16:43:24 · 166 阅读 · 1 评论 -
质数筛(记录)
既是枚举是否是质数,又是枚举倍数。若是就添加进质数数组,不是则继续作为倍数去筛质数。复杂度,但是在内层循环中只枚举质数且只到最小质因数,所以时间复杂度其实是。任何合数都可以分解为若干质数的乘积,且分解式唯一(不考虑顺序)一个合数会被多次标记,例如:6是2和3的倍数,则6被筛了两遍。欧拉筛是对埃氏筛的一种改进,我们规定:一个合数只能被他的。因为4是2的倍数,在之前已经被删掉了。正是这句代码保证了每个合数都是其最小质因数筛掉的。的倍数为合数,将这些数从数组里面删掉。这也是线性筛名字的由来。的最小质因子时停止。原创 2023-10-27 11:45:20 · 70 阅读 · 1 评论