算法学习笔记
记录日常学习算法的知识点以及经验分享
切勿踌躇不前
早安! 午安! 晚安!
展开
-
ACwing算法备战蓝桥杯——Day30——树状数组
树状数组是一种数据结构,能将对一个区间内数据进行修改和求前缀和的这两种操作的最坏时间复杂度降低到O(logn);原创 2023-12-11 18:36:54 · 636 阅读 · 1 评论 -
ACwing算法备战蓝桥杯——Day31——线段树
线段树是一种高级数据结构,能够求出动态区间内的最值问题;线段树实质上是二叉树,每个结点都是一个区间,其中根节点是最大区间,叶子结点是单个数据;每个区间被mid划分成左右两部分;左右结点的下标+这段区间的属性;pushup()函数;pushdown()函数;build()函数:将一段区间初始化为线段树包含一个pushup();根据单点修改或区间修改可以分成两种,大体相同;modeify()函数单点修改包含一个pushup();区间修改包含一个pushdown()与一个pushup();原创 2023-03-27 20:41:17 · 223 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day28——区间DP
ps:一开始前两层我是从前往后枚举区间的左右端点坐标,这样做很显然是错的,因为这样做的话计算的逻辑不是从最小的集合开始逐步推出大集合,也就是说在计算大集合时,划分出来的小集合有的还没有被计算过。第一层为区间长度:因为每个区间都是由更短的区间得来,而枚举区间长度就能这样计算。状态表示:用二维状态f[i][j]表示合并成一个区间 [i,j] 的耗费最小值。第二层为区间的起始坐标:这样就确定了唯一一个区间,并且保证不重不漏;所有DP问题都是从前一个状态推出现在的状态。状态计算:将区间划分成更小的子区间。原创 2023-03-22 22:26:36 · 97 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day27——线性DP
DP问题可以用闫氏DP分析法来做,这个方法的核心思想是用集合的思想来做。这就是为什么DP会比暴力搜索快,因为DP每次处理的是一个集合,暴力搜索每次求的是一种情况;其中状态表示也(就是集合表示)很难想出,只能靠做题积累题型来总结得出;原创 2023-03-22 12:41:53 · 78 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day24——组合数
假设a中最后一个苹果为k,在所有选法中,只有选k的和不选 k的两种情况,分别对应c[a-1][b-1]与c[a-1][b]两种情况,也就有。根据a/b同余于a*(b的逆元),所以公式a!设C(b,a)为在a个数里选b个数的方案数,现要求C(b,a).(如果像方法1一样处理,会超时)这里有一个问题:就是我们在预处理fact[]时会进行mod处理防止数据过大(因为是阶乘会很大),采用递推的方法:c[a][b]=c[a-1][b]+c[a-1][b];c[a][b]表示在a里选b个数的方案个数。原创 2023-03-20 12:04:17 · 125 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day23——快速幂与逆元
在将求(a^k mod p)的时间复杂度从O(k)降到O(log k);要注意的是,数据范围是否会爆int.原创 2023-03-15 22:36:36 · 120 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day21——质数筛选
定义:质数,严格大于1,只能被自身或1整除的数.质数定理:一个正整数n内的质数个数为n/ln(n);原创 2023-03-13 22:22:44 · 84 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day20——二分图
二分图中的结点只有两种属性,两个相邻两个结点只能具有不同的属性;可以抽象成将两种属性的点划分成两个集合,同一集合的点之间没有边;原创 2023-03-11 17:29:06 · 251 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day19——最近公共祖先
描述:这个算法最关键的就是两个数组f[i,j],d[i];f[i,j]数组储存的是i向上移动2^j层能到达的结点;这两个数组要在进行倍增法前,用bfs算法进行预处理;d[i]数组储存的是每个结点的层数;原创 2023-03-09 22:19:50 · 65 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day18——最短生成树
和dijistra算法差不多,但是prime求的是到集合的最短距离,dijistra求的是到某个点的最短距离。用的是并查集数据结构;原创 2023-03-09 00:10:48 · 59 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day17——Floyd
求多源最短路,就是任意两点间的最短路.这个算法较为简单简单,就只是三重循环。原创 2023-03-08 09:03:33 · 59 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day16——spfa
spfa是bellman_Ford算法的优化,基于dp。求带负权的最短路径;原创 2023-03-06 23:51:53 · 117 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——刷题
【代码】ACwing算法备战蓝桥杯——刷题。原创 2023-03-06 00:08:34 · 406 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day15——Dijkstra
简述:对于一个有编号为1~n的n个结点的有向图(权值为正),对于求点1到点n的最短路径。初始假设除第一个结点外,所有结点到结点1无路径(也就是每个点都与结点1不连通,可以设边(1,i)的权值为正无穷大来实现);第二步循环n次(每次确定一个最短路径点),寻找没有确定到结点1最短路径的点的这个集合中,权值最小的为下一个确定为最短路径的点,然后根据这个点的权值,更新未确定最短路径的点权值最后如果n的权值仍为无穷大,那么说明n与1不连通;否则输出点n的到1的距离;原创 2023-03-03 23:50:40 · 83 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day14——拓扑排序
拓扑排序,若一个由图中所有点构成的序列A满足:对于图中的每条边(x,y)x在A中都出现在y之前,则称A是该图的一个拓扑序列。实质上是图的宽度优先遍历;原创 2023-03-02 21:48:59 · 128 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day13——DFS
深度优先搜索,简称DFS.实质上就是递归,代码写法也是递归函数.原创 2023-03-03 23:51:48 · 58 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day12——BFS
这些题都是通过距离数组储存来对层次进行计数和判断是否遍历过!暴力枚举每一个状态,时间复杂度高。就是树的层序遍历,利用队列维护。原创 2023-03-01 00:11:50 · 203 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day11——Tire
Tire(字典树)作为一种数据结构。有两个作用,能够高效地储存和查找字符串。原创 2023-02-28 01:13:17 · 119 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day5——递推
某些性质比如说最常见的“不是黑就是白”,“不是正就是反”,“不是开着就是关着”等;在以确定的状态的基础上递推,不用绕弯,按部就班地推演就行能得到答案。所以主要的问题就是确定数据的某些性质以及划定初始状态。根据已确定的状态推导其他的状态。原创 2023-02-17 22:59:08 · 165 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——day1——前缀和
2.数据范围,假设全部数据都为当前数据可达到的最大值1e4,数据总量为1e5,所以最后一个前缀 和为1e9,又int的最大值为1e9,所以会"爆int",需设置成long long即可;代码62行寻找第三段满足s[n]/3的点 ( 当第三段和第一段都满足时,中间一段自然满足s[n]/3 ),关键点为代码61行,用cnt记录枚举过的数据中每个前缀和满足s[n]/3的次数,也就是第一段;今日份刷题:截断数组,前缀和,子矩阵和,激光炸弹,区域和检索,数组的中心下标,前缀和序列。原创 2023-02-14 00:25:36 · 168 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day3——二分
二分要注意的有两个:1.边界情况的判定:做题只需要记住其中一种正确的方法就行,因为这些方法都是前辈们经过不断实践得出来的,绝对不会出现纰漏。我们学习知识绝大部分都是一个学习的过程,而非创新过程;2.二分的二段性:如何去寻找二段性,应该是最难的一部分,也就是我们思考的过程;刷题总结:1.今天刷题发现做题时的思维不清晰,这是个很大的问题,虽然能做出来,但是效率低下,必须改进;2.应该将重心放在对已学知识的巩固上,比如说将模板题多敲几遍,以及对代码的深入与拓展,多对自己问为什么;原创 2023-02-16 01:03:25 · 118 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day2——差分
假设有一个递增序列s[N],有一个序列a[N]满足{ a1=s1 , a2=s2-s1 , a3=s3-s2 ..... an=sn-sn- 1 }那么a序列就称为s序列的差分序列;有一个数组a[n],其对应的差分数组b[n]为b1=a1,b2=a2-a1,b3=a3-a2......bn=an-an-1;如果要对原数组的[l,r]区间上的数同时增加一个大小为c的数,暴力给每个数加上c,时间复杂度为O(n),在其对应的差分数组上。原创 2023-02-15 00:22:14 · 159 阅读 · 0 评论 -
ACwing算法备战蓝桥杯——Day4——双指针算法
本篇博客为记录在学习双针算法时的理解以及分享一些实用技巧;原创 2023-02-16 20:32:49 · 105 阅读 · 0 评论 -
二分算法例题——特殊排序
关键点:对于每一个黑盒,都可以通过调用compare来获悉其与其他黑盒的大小关系,要么为大于,要么为小于.根据这个特性,对于任意一个黑盒,我们假设已经有一部分黑盒已经排好了序,这部分已完成的黑盒与当前黑盒的大小关系抽象成折线图,大于表示以上一条折线的终点为起点画一条斜率为负的折线,小于则画斜率为正的折线,最后只要找到这条连续折线上的极大值点,就是我们将要插入的新的黑盒的位置,满足左小右大;现在要按每个黑盒满足左小于右的顺序输出对应的编号。原创 2023-02-16 06:00:00 · 48 阅读 · 0 评论 -
蓝桥杯(ACwing)——前缀和——k倍区间
值得一提的是,依然要使用long long来储存前缀和(取极限,储存1e5个1e5,数据量达到1e9次方以上,会“爆int",),并且答案res,取极限,也会爆int.任意一个前缀和可以表示为ak+b(a,b是正整数,a表示倍数,b表示前缀和对k求模),如果有另一个前缀和具有同样的。) 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K倍区间。使用暴力做法只能过两组测试样例,其他都超时;以下 N行每行包含一个整数 Ai(1≤。输出一个整数,代表 K倍区间的数目。第一行包含两个整数 N和 K(1≤。原创 2023-02-14 14:35:09 · 72 阅读 · 0 评论 -
单调栈,单调队列,暴力算法的优化(附带例题详解以及模板)
对于任意时刻的窗口,设新进入窗口的数为new,窗口内的数为old,只要old大于new,old就永远不会作为一个答案输出,所以old可以弹出,不用重复比较.这就是为什么叫单调队列,因为窗口的数据具有单调性,根据单调性输出最值!从而实现时间复杂度降低为O(n)做题的思路都是先用暴力做法写出,再分析出可以对其进行优化的条件。单调栈和单调队列的思想是对暴力算法的优化,与双指针的思想一样。队列例题优化前后时间复杂度对比。原创 2023-01-25 10:03:06 · 162 阅读 · 1 评论 -
关于差分算法中如何在已知原数组的条件下用inerst()函数构造对应的差分数组(附带详解以及例题)
假设有一个数组a1,其对应的差分数组为b1。现在有一个数组a2是对a1数组进行增减操作(即使用inerst(a,b,c)函数)后的形成的,现在要求a2对应的差分数组,只需对b1使用相同的inerst(a,b,c)操作,b1就会转换成a2对应的差分数组b2;原创 2023-01-25 00:44:16 · 107 阅读 · 0 评论