自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 ST表 C++

将原始数据按照固定长度划分为若干个区间,以每个区间的最小元素作为该区间的代表值。然后,根据代表值的特点,利用动态规划的方式计算出每个区间段的最小值。构建好ST表后,可以进行各种区间查询操作,比如查询某个区间的最小值、最大值、平均值等。查询操作的时间复杂度为O(log n),其中n为原始数据的长度。ST表的优势在于它的查询效率高,并且不需要额外的存储空间。它可以应用于各种区间查询问题,如最小值查询、最大值查询、区间和查询等。ST表是一种简洁、高效的数据结构,用于解决区间查询问题。

2024-10-18 18:00:04 332

原创 线性基 高斯消元法 C++

线性基的基本思想是使用一个长度固定的二进制向量表示一组数的线性组合关系。通过不断向线性基中插入新的数,可以将这组数的线性组合关系表示为线性基中的若干个线性无关的向量的异或和。线性基是一种数据结构,用于高效地解决一类与线性无关性有关的问题。具体而言,线性基可以用于快速求解一组非负整数线性组合的最大值、最小值,或者进行异或运算的一些操作。

2024-09-09 15:32:26 336

原创 三维前缀和 C++

如果我们用一个三维数组prefixSum[x][y][z]来表示三维前缀和,其中x、y和z分别表示三维数组的三个维度上的索引。三维前缀和是指在三维数组中,对于每个位置上的元素,计算该位置及其左上角所有元素的和。三维区间求和,考验空间想象能力。

2024-08-31 11:54:55 630

原创 有向图游戏 SG函数【博弈论】C++

如果当前节点v有若干个后继节点,分别为v1,v2,...,v_n,那么SG(v)为所有后继节点的SG值的异或和。即:SG(v) = SG(v1) XOR SG(v2) XOR ... XOR SG(v_n)需要注意的是,有向图游戏中的SG函数只适用于无环图。- SG函数具有性质:SG(v) = SG(w),当且仅当v和w的后继节点的SG值相同。设当前节点为v,那么SG(v)为当前局面的SG值。- 如果SG(v)为0,则当前局面为必败态(先手必输);- 如果当前节点v没有后继节点,则SG(v) = 0。

2024-08-29 16:02:52 391

原创 尼姆(Nim)游戏【博弈论】C++

开始时,有一堆物体,物体的数量可以是任意的。尼姆游戏的关键在于找到赢的策略。根据“尼姆和”的原理,当堆中物体的数量异或(XOR)运算结果为0时,第一个玩家将处于劣势。许多复杂的博弈问题都可以通过尼姆游戏的分析来解决,因为尼姆游戏具有简单而清晰的规则,并且可以应用于各种不同的情境。游戏的目标是通过移动游戏中的物体或减少物体的数量来使对手无法继续移动,从而获得胜利。然而,在实际的尼姆游戏中,玩家可以通过巧妙地选择物体的数量来制造劣势,从而获得胜利。这需要对游戏的状态进行分析,并找到一个优势的策略。

2024-08-26 14:53:40 1199

原创 倍增算法 最近公共祖先(LCA)C++

2. 查询:给定两个节点x和y,首先判断它们的深度d,将深度较大的节点向上移动到与另一个节点处于同一深度。预处理需要O(n log n)的时间来计算每个节点的祖先节点,查询阶段需要O(log n)的时间来计算最近公共祖先节点。这可以通过自底向上的动态规划来实现。第一级祖先节点是每个节点的父节点,第二级祖先节点是每个节点的父节点的父节点,以此类推。最近公共祖先问题是指在一棵有根树中,给定两个节点,找到它们的最近公共祖先节点。最近公共祖先节点是指在树中同时是这两个节点的祖先节点,并且离这两个节点的距离最近。

2024-08-18 21:16:02 418

原创 区间DP 石子合并 C++

石子合并问题是一个经典的区间DP问题,可以用区间DP方法解决。给定一行n个石子,每个石子有一个价值,现要将石子合并成若干堆,每次只能选择相邻的两堆进行合并,合并的得分为两堆石子的总价值,合并后的新堆的价值为得分。dp[i][j] = max{dp[i][k] + dp[k+1][j] + sum[i][j]},其中i

2024-08-17 15:51:13 297

原创 01背包,完全背包 C++

具体而言,给定一组商品,每个商品有一个重量和一个价值,以及一个背包的总容量,要求在不超过背包容量的情况下,选择商品,使得它们的总价值最大化。对于每个容量j,如果j大于等于w,则可以将物品i放入背包,更新dp[j]为dp[j-w]+v和dp[j]中的较大值。其中,dp[j] 表示容量为 j 的背包能够装下的最大价值,dp[j - wi] 表示在放入物品 i 的情况下,容量为 j - wi 的背包能够装下的最大价值。其中,dp[i][j]的值表示在前i个物品中,能够装入容量为j的背包中的物品的最大总价值。

2024-08-17 15:04:32 353

原创 匈牙利算法 二分图最大匹配 C++

增广路径是一个交错的路径,其中非匹配边和匹配边交替出现,起点和终点都是未匹配的节点。通过不断寻找增广路径,可以将匹配的数量不断增加。二分图是指将一个图的节点分为两个不相交的集合,图中的边只能连接两个集合中的节点。3. 如果该节点是已匹配的节点,将该节点的匹配节点作为新的起点,继续进行深度优先搜索,直到找到一条增广路径或遍历完所有相邻节点。2. 对于起点的每个相邻节点,如果该节点是未匹配的节点,直接将其匹配到起点,并结束该路径的搜索。匈牙利算法的时间复杂度为O(M*N),其中M是边的数量,N是节点的数量。

2024-08-16 19:55:37 247

原创 二分图判定 染色法 C++

染色法的思想是从一个顶点开始,将其染色为一种颜色,然后将与它相邻的顶点染成另一种颜色。接着,以与它相邻的顶点为起点,递归地将它们的相邻顶点染成与当前顶点不同的颜色。如果在染色过程中遇到相邻顶点已经被染成与当前顶点相同的颜色,说明该图不是二分图。4. 如果染色过程中遇到相邻顶点已经被染成与当前顶点相同的颜色,说明该图不是二分图。3. 以与起点相邻的顶点为起点,递归地进行染色操作,直到所有顶点都被染色。2. 对于与起点相邻的顶点,将其染成与起点不同的颜色。1. 选择一个顶点作为起点,并将其染成一种颜色。

2024-08-16 19:14:27 333

原创 单调栈,单调队列 C++

单调栈的基本思想是利用栈的特性,在元素入栈时进行一些操作,以保持栈内元素的单调性。在入栈过程中,如果新元素比栈顶元素更小,那么栈顶元素就不可能成为后续元素的最大值或满足特定条件的值,因此可以将其出栈。单调队列的特点是,队列中的元素保持递增或递减的顺序。当新元素进入队列时,首先将队列中比新元素小(或大)的元素移除,然后将新元素插入队列。它的特点是元素在栈内的顺序是单调的,通常为单调递增或单调递减。通过维护单调队列,在每次窗口滑动时,可以通过队列的头部元素即可获取窗口中的最大值或最小值。

2024-08-16 16:19:06 421

原创 三分法 C++

它通过将搜索区间分为三个部分并比较函数在两个划分点的取值,逐步缩小搜索范围来确定极值的位置。三分算法的时间复杂度为O(log N),其中N为搜索区间的长度。它的优势在于可以在单峰函数中快速找到极值的位置,但不适用于非单调函数或多峰函数的寻优问题。4. 比较两个划分点的函数取值,如果其中一个划分点的函数值更大(或更小),则极值在该划分点的同侧。5. 根据比较结果更新搜索区间,将较小(或较大)的划分点所在的区间作为新的搜索区间。7. 返回搜索区间的中点作为极值的近似位置。3. 计算两个划分点的函数取值。

2024-08-16 15:53:18 369

原创 整型二分,浮点二分法 C++

需要注意的是,由于浮点数的精度问题,如果要查找的目标值非常接近区间的边界,可能无法准确地找到目标值,而是得到一个非常接近但不完全相等的浮点数。另外,在实际应用中,可能还需要设置一个终止条件来避免无限循环,例如在已知的精度范围内无法再继续缩小区间。浮点二分法的基本思想是通过将区间不断地二分,来逐步缩小查找范围,直到找到目标值或确定目标值不存在。- 如果M等于目标值,那么找到了目标值,返回M。- 如果M小于目标值,那么将L设为M,继续二分。- 如果M大于目标值,那么将R设为M,继续二分。

2024-08-16 12:08:43 376

原创 高精度乘法,除法 C++

需要注意的是,高精度乘法和除法的实现需要考虑多种情况,如两个大数的符号、除数为零等。此外,由于高精度乘法和除法的计算复杂度较高,对于大规模数据的运算,可能会导致程序运行时间较长。高精度乘法的时间复杂度为O(n^2),其中n为大数的位数。与高精度乘法类似,高精度除法也通过数组或字符串来表示大数,通过循环和借位操作来实现除法运算。高精度除法的时间复杂度为O(n^2),其中n为大数的位数。由于计算机内部的整数类型通常有位数的限制,无法直接处理大数运算,高精度乘法和除法技术应运而生。

2024-08-15 22:11:34 345

原创 线段树的建立,修改,查询,更新 C++

首先需要找到代表该区间的节点,如果当前节点代表的区间正好等于要查询的区间,则直接返回节点的值。否则,根据当前节点代表的区间和要查询的区间的关系,将查询操作转移到当前节点的左子节点或右子节点,并将子节点返回的信息合并起来。首先需要找到需要修改的节点,如果当前节点代表的区间正好等于要修改的区间,则直接更新节点的值。否则,根据当前节点代表的区间和要修改的区间的关系,将修改操作转移到当前节点的左子节点或右子节点。问题:给定一个区间,需要对该区间的某个特定信息进行更新操作,如修改某个元素的值、增加某个元素的值等。

2024-08-15 16:11:46 965

原创 求组合数 C++

递推法求组合数是一种的方法。它通过将问题分解成较小规模的子问题,并利用已经求解过的子问题的结果进行递推求解。快速幂求组合数是利用快速幂算法来求解幂的问题,而组合数可以表示为一个幂的形式。卢卡斯定理是用来求解组合数模质数的问题。它通过将组合数中的分子和分母都分解成质因数的幂次,然后利用模运算的性质进行计算。- 卢卡斯定理的优点是可以高效地求解组合数模质数的问题,但它。- 递推法求组合数的优点是可以求解任意数量的组合数,但是它的。

2024-08-13 20:17:02 250

原创 数学(判断质数,求质因数,求组合数 ) C++

【代码】数学(判断质数,求质因数,求组合数 ) C++

2024-08-13 17:43:37 137

原创 Kruskal算法 C++

Kruskal算法的时间复杂度主要取决于边的排序过程,通常为O(E log E),其中E为图中的边数。在每次选择边的过程中,需要保证加入的边不会造成生成树中出现环路,即边的两个端点不在同一个连通分量中。1. 算法需要对所有边进行排序,排序的时间复杂度为O(E log E),其中E为边的数量,因此在边的数量较大时,算法的效率会降低。3. 依次遍历排序后的边,如果加入该边不会导致生成树中出现环路,则将该边加入生成树,并将边的两个端点合并到同一个连通分量中。最小生成树是一个无向图的生成树,其边的权重之和最小。

2024-08-12 21:09:21 279

原创 Prim算法 C++

2. 算法每次选择一个顶点加入最小生成树,因此对于图中每个顶点都需要进行判断和更新,而不仅仅是处理边。通过维护一个数组来标记是否访问过顶点,以及一个数组来记录每个顶点的最小生成树的边。1. 算法的时间复杂度较高,在稀疏图的情况下,边的数量远小于顶点数量的平方,算法的时间复杂度接近O(V^3)。2. 算法的时间复杂度为O(V^2),其中V是顶点的数量。Prim算法的时间复杂度为O((V+E)logV),其中V为顶点数,E为边数。3. 算法保证了生成的最小生成树是原图的子图,即包含了所有顶点。

2024-08-12 19:29:12 431

原创 Floyd算法 C++

对于每对节点i和j,检查节点k是否可以通过更短的路径成为节点i到j的中间节点。即,检查节点i到节点j的路径长度是否大于节点i到节点k再到节点j的路径长度。如果是,则更新节点i到节点j的路径长度为节点i到节点k再到节点j的路径长度。初始时,矩阵的值为图中节点之间的直接距离,如果两个节点直接相连,则距离为边的权重;相比于Dijkstra算法和Bellman-Ford算法,Floyd算法可以处理有负权重的图,但是由于时间复杂度较高,适用于节点数量较少的情况。最终得到的矩阵即为所有节点对之间的最短路径长度。

2024-08-12 16:34:41 146

原创 Bellman-Ford算法 C++

由于Bellman-Ford算法可以处理负权边,但是不能处理负权回路。Bellman-Ford算法是一种解决最短路径问题的动态规划算法,该问题是求解从源节点到其他节点的最短路径。2. 进行V-1次循环,每次循环遍历所有的边,对于每个边(u,v),如果通过u节点可以获得更短的距离到达v节点,则更新v节点的距离为新的更短距离。2. 可以处理负权边:相比于Dijkstra算法,Bellman-Ford算法可以处理负权边。该算法的时间复杂度为O(V*E),其中V是节点的数量,E是边的数量。

2024-08-11 17:24:39 578

原创 Dijkstra算法 C++

3. 算法的时间复杂度较低:在使用适当的数据结构(如最小堆)和优化技巧(如提前终止)的情况下,Dijkstra算法的时间复杂度可以降低到O((V+E)logV),其中V是顶点数,E是边数。2. 算法需要额外的空间:Dijkstra算法需要使用额外的数据结构(如距离数组和前驱数组)来存储每个顶点的最短路径和前驱顶点,因此需要额外的空间来存储这些信息。1. 算法确保找到所有的最短路径:Dijkstra算法能够找到从起始顶点到所有其他顶点的最短路径,并且保证这些路径是实际的最短路径。6. 返回最终的距离数组。

2024-08-11 14:01:49 795

原创 memset函数的用法

需要注意的是,value参数的取值范围应该在0到255之间,因为被设置的内存区域是以字节为单位的。如果value的值超出了这个范围,则会被截断为0到255之间的值。它可以快速地将内存区域的所有字节都设置为特定的值,是C语言中非常常用的一个函数。memset函数的作用是将从ptr指针指向的内存地址开始的num个字节都设置为value值。这个函数通常用于初始化内存,也可以用于将某些特定字节的值替换为其他值。memset函数是C语言中的一个标准库函数,用于将一段内存区域的每个字节都设置为特定的值。

2024-08-11 13:38:36 382

原创 并查集--图论 C++

并查集(Disjoint Set Union, DSU)

2024-08-09 21:37:44 300

原创 KMP算法(字符串匹配) C++

在预处理模式串时,KMP算法会构建一个辅助数组next,其中next[i]表示模式串P在第i个位置之前的最长公共前后缀的长度。KMP算法解决的问题是在一个文本串S中查找一个模式串P的出现位置。传统的字符串匹配算法(如暴力匹配算法)的时间复杂度为O(n*m),其中n和m分别是文本串S和模式串P的长度。KMP算法的时间复杂度为O(n+m),其中n和m分别是文本串S和模式串P的长度。4. 如果j到达模式串P的末尾,则匹配成功,返回i-j作为模式串P在文本串S中的起始位置。1. 根据模式串P构建next数组。

2024-08-09 20:27:56 105

原创 高精度加法,减法--C++

高精度加法和减法是在计算机编程中常用的算法,用于处理超出计算机能力范围的大整数运算。在正常的计算机运算中,整数的范围是有限的,通常是32位或64位。但在某些场景中,需要进行超过这个范围的整数运算,这时就需要使用高精度加法和减法算法。算法的基本思想是从低位开始逐位相加,并将结果保存在一个新的整数中。最终得到的结果即为两个大整数相加的结果。高精度减法是指对两个大整数进行相减的操作。算法的基本思想是从低位开始逐位相减,并将结果保存在一个新的整数中。最终得到的结果即为两个大整数相减的结果。

2024-08-09 19:13:00 132

原创 拓扑排序算法 C++

3.取桟或队列的节点x,删去x的路径(其实就是删掉x链接节点的入度),当入度减少时,循环节点,压入所有入度为0的点,在去重节点的同时计数;4.直到桟或队列的大小为0,若计数的大小等于节点数,则为无环,反之,有环;2.初始化桟或队列,循环节点压入所有入度为0的点;1.用桟或队列来储存入度为0的点;拓扑排序是用来判断图是否有环。

2024-08-09 17:26:36 281

原创 如何对vector进行去重 C++

2.利用 unique ( v.begin(), v.end() );1. set会自动进行排序去重。

2024-08-09 11:32:08 712

原创 简便的素数筛写法 C++

【代码】简便的素数筛写法。

2024-08-08 21:09:08 121

原创 求逆元的方法 C++

x,y的值为同余方程(ax+by=gcd(a,b)=1)的值 ,逆元的值为(x+mod)%mod;2.当模数p为质数时,a的(p-2)次方为a的逆元。

2024-08-08 21:07:16 287

原创 priority_queue(结构体比较)(重载函数)C++

priority_queue

2024-08-08 20:55:58 193

原创 位运算 C++

那么,同或怎么表示呢?同或就是异或取反就好啦.

2024-08-07 20:17:05 465 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除