- 博客(110)
- 收藏
- 关注
原创 数学知识——同余
线性同余方程对于一组a,b,ma,b,ma,b,m,我们想要求出一个xxx,使得ax≡b(mod m)ax≡b(mod\ m)ax≡b(mod m)。ax≡b(mod m)ax≡b(mod\ m)ax≡b(mod m)ax=km+bax=km+bax=km+bax−km=bax-km=bax−km=b令k′=−kk^{'}=-kk′=−kax+k′m=bax+k^{'}m=bax+k′m=b如果bbb不是(a,m)(a,m)(a,m)的倍数,那么一定无解,因为ax+k′max+k^{'}max
2025-04-11 11:34:20
1048
原创 数学知识——矩阵乘法
对于一个递推问题,如递推式的每一项系数都为常数,我们可以使用矩阵快速幂来对算法进行优化。FnF1×An−1由于递推式的每一项系数都为常数,因此对于每一步的递推,A里面都是相同的常数。对于An−1部分使用快速幂求解,根据Fn就能得到最终答案。
2025-04-09 23:10:28
656
原创 数学知识——快速幂
BSNY 在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列。现在给你 整数 序列的前三项,这个序列要么是等差序列,要么是等比序列,你能求出第。如果正向求的话有困难,考虑先求出总情况数,再减去不可能越狱的状态数。因为每一个整数都可以唯一表示为若干指数不重复的2的次幂的和,对于。如果相邻房间的犯人信仰的宗教相同,就可能发生越狱。可能越狱的状态数,对 100003取余。项的值太大,对其取模 200907。种宗教,每个犯人可能信仰其中一种。个房间,每个房间关押一个犯人。
2025-04-08 10:21:07
708
原创 数学知识——分解质因数
内的每一个数分解质因数,再把对应质因数的次方数加起来就是。分解质因数,按照算术基本定理的形式输出分解结果中的。的质因数最多有一个,也正因此我们可以只考虑。分解质因数后的结果,共若干行,每行一对。按照 pi 从小到大的顺序输出。分解质因数的结果中所对应的次方数为。范围内的质数,对于每一个质数。分解质因数之后,大于。的数,最后再做特判。一个直观的想法是对于。
2025-04-07 14:00:01
438
原创 数学知识——筛质数
质数定义:一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数,这个数就是质数。华生挑战夏洛克,让他给这些珠宝染色,使得一件珠宝的价格是另一件珠宝的价格的质因子时,两件珠宝的颜色不同。因为一个合数的倍数一定为一些质数的倍数,所以在这里我们只考虑了去枚举质数的倍数,避免了一定的重复。中的每个数,如果出现了余数为 0,则这个数不是质数,如果没有出现余数为 0,则这个数是质数。是最小的),如果存在相同距离的其他相邻质数对,则输出第一对。
2025-04-07 13:59:39
1333
原创 算法竞赛——图论知识全家桶
单源最短路径问题(Single Source ShortestPath,SSSP问题)是说,给定一张有向图GVEV是点集,E是边集,∣V∣n∣E∣m,节点以1n之间的连续整数编号,xyz描述一条从x出发,到达y,长度为z的有向边。设1号点为起点,求长度为n的数组dist,其中disti表示从起点1到节点i的最短路径的长度。
2025-03-15 13:32:52
1602
原创 图论——二分图
如果一张无向图的N个节点N≥2可以分成AB两个非空集合,其中A∩B∅,并且在同一集合内的点都没有边相连,那么成这张无向图为一张二分图。
2025-03-15 13:22:02
791
原创 图论——拓扑排序
对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边uv>∈EG,则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
2025-03-14 17:12:08
822
原创 图论——无向图的双连通分量
给定无向图GVE若对于x∈V,从图中删去节点x以及所有与x关联的边后,G分裂成两个不连通的子图,则称x是G的。若对于e∈E,从图中删去边e之后,G分裂成两个不相连的子图,则称e为G的桥或。无向边xy是桥,当且仅当搜索树上存在x的一个子节点ydfnxlowy在无向图中不存在横插边,所以说如果满足以上条件,要么说明以y为根的子树只存在树边,要么说明下图中存在类似于红色这样的后向边,即无法通过其他路径到达x或以上的部分,即把xy。
2025-03-11 14:01:59
778
原创 图论——欧拉回路和欧拉路径
给定一张无向图,若存在一条从节点S到节点T的路径,恰好不重不漏地经过每条边一次(可以重复经过图中的节点),则称该路径为S到T的欧拉路。特别地,若存在一条从节点S出发地路径,恰好不重不漏地经过每条边一次(可以重复经过图中的节点),最终回到起点S,则称该路径为欧拉回路,存在欧拉回路的无向图被称为欧拉图。一、无向图1 存在欧拉路径的充要条件 : 度数为奇数的点只能有0或2个2 存在欧拉回路的充要条件 : 度数为奇数的点只能有0个二、有向图。
2025-03-11 14:01:47
1431
原创 图论——有向图的强连通分量
对于分量中任意两点u,v 必然可以从u走到v 且从v走到u:极大连通分量有向图的强连通分量无非是以下两种情况:1.绿色:存在后向边指向祖先结点2.红色:存在横插边指向的点有指向这两个点公共祖先节点从实际应用的角度来说,我们在求完强连通分量之后会进行缩点的操作。缩点之后,该图就变成了有向无环图(拓扑图)了,这样处理起来就会很方便。
2025-03-10 19:47:59
1061
原创 图论——差分约束
差分约束是一类特殊的不等式约束问题,其形式为xi≤xjc,其中xixj为变量,c为常数。这类问题可以通过转换为单源最短路问题来求解其可行解。我们证明一个差分约束和一个最短路问题是等价的:1.假设我们已经通过最短路算法求出了一个图中从源点s到所有节点的最短路径disti,根据最短路的松弛性质,对于任意一条边j→iw,都有disti≤distjw,因此,最短路的解满足所有的边权约束条件。
2025-03-10 19:47:47
1214
原创 图论——spfa判负环
图G中存在一个回路,该回路边权之和为负数,称之为负环。:统计每个点入队次数, 如果某个点入队n次, 说明存在负环。证明:一个点入队n次,即被更新了n次。一个点每次被更新时所对应最短路的边数一定是递增的,也正因此该点被更新n次那么该点对应的的最短路长度一定大于等于n,即路径上点的个数至少为n+1。根据抽屉原理,路径中至少有一个顶点出现两次, 也就是路径中存在环路。而算法保证只有距离减少才会更新, 所以环路权值之和为负数。:统计从起点到任意顶点最短路经过的边数, 若某点对应边数cnt≥n。
2025-01-30 19:43:59
1307
原创 图论——floyd算法
为了求出图中任意两点间的最短路径,当然可以把每个点作为起点,求解N 次单源最短路径问题。不过,在任意两点间最短路问题中,图一般比较稠密。使用floyd算法可以在ON3的时间内完成求解,并且程序实现非常简单。设Dkij表示“经过若干个编号不超过k的节点”从i到j的最短路长度。该问题可划分为两个子问题,经过编号不超过k-1的节点从i到j或者从i先到k再到j。于是DkijminDk−1ijDk−1ikDk−1kj。可以看到,Floy。
2025-01-30 19:43:39
819
原创 图论——最小生成树的扩展应用
我们考虑kruskal算法,kruskal算法是从大到小枚举每个边,如果该边两端不连通则加入该边,当我们当前枚举的边权为d时,虽然实际上我们只是在小于等于d的边权中选择将能够实现联通的边加入了最小生成树生成了若干连通块,然而实际上这和把边权小于等于d的边全部连起来形成连通块的情况是相同的,也正因此我们上面这个问题和kruskal算法实际上是等价的,我们可以用kruskal算法来做。值越大的型号价格越贵。不过,他并不想让他的竞争对手知道他具体的运输方案,所以他希望采用费用第二小的运输方案而不是最小的。
2025-01-29 17:13:00
1560
1
原创 图论——最小生成树
给定一个无向图,在图中选择若干条边把图的所有节点连起来。要求边长之和最小。在图论中,叫做求最小生成树。prim 算法采用的是一种贪心的策略。每次将离连通部分的最近的点和点对应的边加入的连通部分,连通部分逐渐扩大,最后将整个图连通起来,并且边长之和最小。prim算法的贪心策略为什么是正确的?当我们循环到某一部中,当前的连通块为图中绿色虚线内部分,离连通部分的最近的点和点对应的边如下图所示。
2025-01-29 17:11:46
1460
原创 图论——单源最短路的扩展应用
有一天,琪琪想乘坐公交车去拜访她的一位朋友。由于琪琪非常容易晕车,所以她想尽快到达朋友家。现在给定你一张城市交通路线图,上面包含城市的公交站台以及公交线路的具体分布。已知城市中共包含nnn个车站(编号1~n1~n1~n)以及mmm条公交线路。每条公交线路都是 单向的,从一个车站出发直接到达另一个车站,两个车站之间可能存在多条公交线路。琪琪的朋友住在sss号车站附近。琪琪可以在任何车站选择换乘其它公共汽车。请找出琪琪到达她的朋友家(附近的公交车站)需要花费的最少时间。输入格式输入包含多组测试数据。每组测试数
2025-01-28 17:11:45
1504
原创 图论——单源最短路的综合应用
我们把边权大于x的边权置为1,小于等于x的边权置为0,这样一来图就是一个只有0,1边权的图,我们可以求出一条从1到n的最短路径,如果路径长度。阿龙通过这样的贸易方式赚取旅费:他会选择一个经过的城市买入他最喜欢的商品――水晶球,并在之后经过的另一个城市卖出这个水晶球,用赚取的差价当做旅费。怎样走,才需要最少的时间?2.对于答案右边的区间,x变大了,大于x的边数就会减小,即大于x的边数小于k,同样满足性质;2.对于答案左边的区间,x变小了,大于x的边数就会增加,即大于x的边数大于k,不满足性质。
2025-01-28 17:11:37
821
原创 图论——单源点最短路径建图方式
单源最短路径问题(Single Source ShortestPath,SSSP问题)是说,给定一张有向图GVEV是点集,E是边集,∣V∣n∣E∣m,节点以1n之间的连续整数编号,xyz描述一条从x出发,到达y,长度为z的有向边。设1号点为起点,求长度为n的数组dist,其中disti表示从起点1到节点i的最短路径的长度。
2025-01-27 20:37:43
1074
原创 动态规划——斜率优化DP
单调递增的了,上一题中,对于凸包的头部和尾部均使用单调队列来处理,本题则需要使用二分去找到合适的点对,对尾部的处理同样使用单调队列。进行一个从小打到的排序。这样一来,相邻一段猫肯定是要由一个饲养员接走的,饲养员的出发时间就是这一段最后一只猫对应的数组。大于队头两个点的斜率时,那么一开始的点就可以彻底删除,在以后也不会用到,所以凸包中的点可以用单调队列来维护。和上一题不同的是, 本题中机器的工作时间可以为负数,也正因此斜率。是单调递增的,也就是说,如果当前的斜率。2.插入的时候,把不在凸包上的点删掉。
2025-01-27 20:37:09
1495
原创 学习笔记——动态规划
递推问题包括动态规划,动态规划一定是递推,递推不一定是动态规划。动态规划是一种决策性的问题,是在状态中做最优决策的一种特殊递推算法,通常的问法包括求最大最小值等,而递推可能还会包括求种类数等问题。递推是一种算法,用来解决一类特殊的问题,而递归是程序实现的形式,不属于算法范畴。1.状态定义(核心环节,f[i][j]:f[i][j]:f[i][j]:符号表达式以及对这个表达式的文字定义)2.确定递推公式(形如dp[i][j]=dp[i−1][j]+dp[i][j−1]dp [ i ][ j ]=dp [ i
2025-01-22 20:49:01
1213
原创 动态规划——单调队列优化DP
本题是一个二维单调队列问题,先对每一行求出以i位置结尾的长度不大于n的窗口的最大值与最小值,存放在数组row_max和row_min里面,再对于纵向求一遍,遍历row_max和row_min的每一列,便可以得到每一个正方形的最大值与最小值,做差即可。对于顺时针,维护一个前缀和数组s,s[i]表示从1位置出发到i+1位置时的剩余油量。集合:对于前i个烽火台,第i个烽火台被点燃的所有方案。集合:以i为右端点,长度不超过m的连续子序列的和。集合:对于前i道题,做了第i道题的所有方案。
2025-01-16 18:55:34
1040
原创 动态规划——数位DP
题目清单acwing1801.度的数量我们依次从前往后去枚举an−1an−2...a1a0a_{n-1}a_{n-2}...a_1a_0an−1an−2...a1a0每一位,第一位是第n-1位,最后一位是第0位,对于第一位,我们如果把当前位的值取为[0,an−1−1][0,a_{n-1}-1][0,an−1−1],也就是说不超过当前位置上限的话,那么下面的所有位置都能随便取也不会超过an−1an−2...a1a0a_{n-1}a_{n-2}...a_1a_0an−1an−2...a1
2025-01-16 18:55:21
731
原创 动态规划——树形DP
和上一题不同的是,上一题中每个节点可以负责和它相邻的所有边,而本题中每个节点可以负责和他相邻的所有节点。集合:对于以u节点为根的子树,u由子节点负责(1)或u由父节点负责(0)或u由自己负责(2)的方案。集合:对于以u节点为根的子树,考虑到u的第i个子树并且总树枝数量为j的所有集合。求出每个点u的最长路径d1和次长路径d2,一个节点到其他节点的最远距离为。集合:对于以u节点为根的子树,选择(1)或不选择(0)u节点的方案。集合:对于以u节点为根的子树,选择(1)或不选择(0)u节点的方案。
2025-01-15 11:48:00
881
原创 动态规划——状态压缩DP
和玉米田不同的是,玉米田里面的十字大小是3*3,而本题是5*5,也就是说上面两行的状态都会影响本行状态的选择,也就是说如果想要由上一个状态转移而来,需要改变状态的定义。不包含连续数量为奇数的0,即第i-1列在原先状态k的基础上,又摆放了长方形去让第i列变成状态j从而将本状态变成。集合:已经摆放好前i-1列,并且从第i-1列延伸到第i列的状态是j时的方案。集合:已经摆放好前i行,并且第i-1行的状态是j,第i行状态时k时的方案。,即第i-1列的状态k有位置去摆放横向的长方形,去让第i列变成状态j。
2025-01-15 11:47:49
1127
原创 动态规划——区间DP
本题可以用区间DP来做的关键点在于,中序遍历的顺序就是树上每一个点投影的顺序,也正因此对于给定中序遍历序列的每一个区间,都能对应原树上的一棵完整的子树。本题和上一题的区别就是本题是环形,考虑枚举链中每一个断开的位置,一共有。最外层枚举长度,第二次枚举开始位置,第三次枚举k的位置,时间复杂度为。右边的区域,再把合并之后的两个能力石进行合并,因为将能量石。集合:将区间[i,j]内的石子合并在一起的方案。集合:将区间[i,j]内的石子合并在一起的方案。集合:将区间[i,j]内的石子合并在一起的方案。
2025-01-14 09:51:24
959
原创 动态规划——状态机模型
集合:考虑前i天,第i持有股票且这是第j支股票/第i天没有持有股票且已经买卖j支股票的方案。集合:密码已经生成了i位,以i结尾的后缀和子串匹配长度为j的所有方案。集合:考虑前i天,第i天持仓(0),空仓(1),冷冻期(2)的方案。集合:考虑前i家店铺,第i家偷(1)或不偷(0)的方案。状态之间的转移关系用KMP算法进行匹配。当第i+1位匹配子串的u位置时,
2025-01-14 09:51:08
1604
原创 动态规划——背包模型
题目清单acwing2.01背包问题状态表示集合:dp[i][j]dp[i][j]dp[i][j]:所有只考虑前i件物品,且总体积不超过j的选法集合。属性:maxmaxmax状态计算dp[i][j]=max(dp[i−1][j],dp[i−1][j−v[i]]+w[i])dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i])dp[i][j]=max(dp[i−1][j],dp[i−1][j−v[i]]+w[i])#include <iostream
2025-01-13 20:10:40
953
原创 动态规划——最长上升子序列模型
证明:假设当前数是b,放在了a的后面,显然需要满足a>=b,此时所有拦截系统的最低高度分别是b,inf(还没有开出来的系统,用于和单独开一个系统做对照),以及其他;和1017比较相似,1017进行了正向反向两次dp,取两次中的d最大值,本问题相当于是求先上升后下降的最长子序列,需要进行正向反向两次dp,求完之后对应位置求和,最后再遍历一遍求最大值。满足要求的组合一直是上坐标和下坐标的相对大小顺序是相同的,也正因此本问题等价于将每一对城市的组合按照上坐标的大小进行排序,再求下坐标的最长上升子序列长度。
2025-01-13 20:10:21
1096
原创 动态规划——数字三角形模型
给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。摘花生问题考虑的是最大值,本问题考虑的是最小值,为了避免边界的影响,需要将dp所有位置上的值初始化为正无穷。:两条路同时走,步数为k,第一条路在纵向上走到i,第二条路在纵向上走到j时的所有路线上数值和的最大值。注意t的取值,如果i ==j说明两条路线到达的同一位置,t只取。输出一个整数,表示最大的路径数字和。的所有路线上的费用的最小值。
2025-01-02 14:36:31
1140
原创 《算法竞赛进阶指南》0x48可持久化数据结构
到目前为止,我们学习心得数据机构都是“数据集的最新状态”。若想知道数据集再任意时刻的历史状态,(即∀i∈1M,执行完操作序列中第i项操作后的数据集的状态),一种朴素的做法是∀i∈1M,在第i项操作执行完毕后,把整个数据结构都拷贝一边,存储在history[i]中,多耗费M倍的空间。“可持久化”提供了一种新的思想,在每项操作结束后,仅创建数据结构中发生改变的部分的副本,不拷贝其他部分。这样一来,维护数据结构的时间复杂度没有增加,空间复杂度仅增长为与时间同级的规模。
2025-01-02 14:36:14
1020
原创 《算法竞赛进阶指南》0x46二叉查找树与平衡树初步
给定一棵二叉树,树上每个节点有一个数值,成为节点的“关键码”。所谓”BST性质“是指对于树上任何一个节点:1.该节点的关键码不小于它的左子树中任意节点的关键码;2.该节点的关键码不大于它的右子树中的意节点的关键码。满足以上性质的二叉树就是一棵二叉查找树(BST)。显然,二叉查找树的中序遍历是一个关键码非严格单调递增的节点序列。10010set可以进行的操作是 1.插入,2.删除,3.求前驱/后继,4.找最大/最小BST可以在set功能的基础上面实现 5.求某个值的排名,6.求排名是k的值。
2025-01-01 18:41:15
589
原创 《算法竞赛进阶指南》0x44分块
它们之所以能够高效地在一个序列上执行指令并统计信息,就是因为他们把序列中的元素聚合成大大小小的“段”,花费额外的代价去对这些段进行维护,从而使得每个区间的信息可以快速地由几个已知的“段”结合而成。1到k-1段符合条件的磁石一定在开头,我们直接在第1到k-1段中,从每段左端开始注意扫描,把能吸引进来的都吸引进来,直到出现第一个不能吸引的磁石(位置P)。之后,把这一段的左端点移动到P的位置。执行一个BFS框架,建立一个队列,追出只包含磁石L,每次从队头取出磁石,把所有能够吸引的磁石加入到队尾。
2025-01-01 18:40:54
1270
原创 《算法竞赛进阶指南》0x43_2线段树
但是使用第二种形式的话,如果我们加数,那么就是b+=add,如果我们乘数,那么就是a*=mul,b*=mul,因此可以很容易转化为统一的形式。若有标记,就根据标记信息更新p的两个子节点,同时为p的两个子节点增加标记,然后清除p的标记。其中sum是区间和,add是每一个数要加的数,mul是每一个数要乘的数。的情况下立即返回,只不过在回溯之前向节点p增加一个标记,标识"该节点曾经被修改,但其子节点尚未被更新"。在DOWN的时候,考虑如何更新子节点的sum,mul,add。对于t.mul,我们让。
2024-12-31 09:50:20
1191
原创 《算法竞赛进阶指南》0x43_1线段树
线段树线段树是一种基于分治思想的二叉树结构,用于在区间上进行信息的统计,与按照二进制进行区间划分的树状数组相比,线段树是一种更加通用的数据结构。1.线段树的每一个节点都代表一个区间。2.线段树具有唯一的根节点,代表的区间是整个范围[1, n]。3.线段树每个叶子节点都代表一个长度为1的元区间[x, x]。4.对于每个内部节点[l, r],他的左子节点是[l, mid], 右子节点是[mid+1, r],其中mid=(l + r) >> 1。由上图可以看出,除去树的最后一层,整个线段
2024-12-31 09:31:00
1041
原创 《算法竞赛进阶指南》0x42树状数组
背景:如果给定一个数组,对这个数组进行对某一个数进行修改,以及求出[1,x]的和这两个操作。如果使用普通的数组,那么第一个操作的时间复杂度是O1,第二个操作的时间复杂度是On。如果使用前缀和数组,那么第一个操作的时间复杂度是On,第二个操作的时间复杂度是O1。不管哪个结构都有一个操作的时间复杂度过高,考虑优化,也正因此引出了一种新的结构——树状数组。每个结点t[x]保存以x为根的子树中叶结点值的和每个结点覆盖的长度为lowbit(x)
2024-12-30 16:43:38
1087
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人