算法模板
文章平均质量分 64
漆黑の莫莫
阿罗拉!!!
展开
-
【树与图的dfs】
本题的本质是树的dfs, 每次dfs可以确定以u为重心的最大连通块的节点数,并且更新一下ans。将认为的点(重心)删除,剩余的其余连通块中点的最大值是最小的,输出连通块点数值。也就是说,dfs并不直接返回答案,而是在每次更新中迭代一次答案。这样的套路会经常用到,在 树的dfs 题目中。原创 2024-05-24 19:22:51 · 308 阅读 · 0 评论 -
【动态规划】线性DP
一:状态表示:一维dp[i]我们让dp[i]表示为所有以a[i]结尾的严格单调上升子序列长度的Max值。二:状态计算:直接求dp[i]不好求,所以我们以a[ i ]结尾的序列的前一个数存在的情况进行分类dp[i]= max(dp[i], dp[j] + 1) 状态表示:二维 f(i,j) ,从起点到(i,j)的max路径状态计算:左上来的 f[i-1,j-1]+a[i,j] 右上来的 f[i-1,j]+a[i,j] a[ ]为(i,j)的原创 2023-05-10 21:31:40 · 472 阅读 · 0 评论 -
【动态规划】背包问题
n 个物品,容量为V的背包Vi 体积 Wi 价值(权重)二:01背包每件物品最多只能用1次(要么0次,要么1次)集合划分:f(i,j)=Max(f(i-1,j),f(i-1,j-Vi)+Wi)三:完全背包每件物品都有无限次 四:多重背包每个物品最多有Si个五:分组背包n组,每组只能选1个(原先用二维数组表示状态,可以换成一维数组,用滚动数组(下一层只用到上一层来算,滚动交替计算)的方式。注:动态规划的优化,通常都是对代码或者状态转移方程,做等价变型)原创 2023-04-26 23:22:18 · 531 阅读 · 5 评论 -
【数学知识】一文学会算法中的数学知识(1.1)
一.数论1.质数在大于1 的整数,只包含1和本身这两个约数,则称为质数(素数) 2 3 5 7 11 13 17(1)质数的判断试除法(优化)枚举到根号x O(根号x) bool is_prime(int x){ if (x < 2) return false; for (int i = 2; i原创 2023-04-15 15:59:39 · 465 阅读 · 7 评论 -
【STL】一文拿下所有C++stl
1. size() 返回元素个数2. empty() 返回是否为空3. clear() 清空7. []8.支持比较运算,按字典序1. first, 第一个元素2.second, 第二个元素3.支持比较运算,(字典序)1. size()/length() 返回字符串长度2. empty()3. clear()4. substr(起始下标,(子串长度)) 返回子串5. c_str() 返回字符串所在字符数组的起始地址先进先出1. size()原创 2023-04-08 22:39:34 · 475 阅读 · 10 评论 -
【算法模板】离散化
有许多数分布在数轴上,数的取值范围很广,但是这些数的个数相对来说不是很多,要求对数轴上某个区间上的数进行求和等操作,可使用离散化模版,将数值映射到下标。基本的步骤可以分为:1、用一个辅助的数组把你要离散的所有数据存下来。2、排序,排序是为了后面的二分。3、去重,因为我们要保证相同的元素离散化后数字相同。4、索引,再用二分把离散化后的数字放回原数组。原创 2023-03-15 12:13:41 · 595 阅读 · 16 评论 -
【算法模板】区间合并
给定 n 个区间 [li,ri],要求合并所有有交集的区间。思路:可以将n个区间先按左端点排序,维护一个区间,并将维护区间与后面一个区间进行三种情况的比较(1.后一个区间包含于维护区间;2.后一个区间与维护区间部分相交;3.两个区间不相交),若后一个区间和当前维护的区间不相交时,需要将当前维护的区间存储到结果数组里,并将后一个区间作为新的维护区间,继续以上有关操作。原创 2023-03-15 11:15:28 · 413 阅读 · 6 评论 -
【算法模板】双指针算法
双指针算法的意义是对于两个循环的朴素算法O(n*n)的操作优化到O(n)朴素算法每次在第二层遍历的时候,是会从新开始(j会回溯到初始位置),然后再遍历下去。(假设i是终点,j是起点)双指针算法:由于具有某种单调性,每次在第二层遍历的时候,不需要回溯到初始位置(单调性),而是在满足要求的位置继续走下去或者更新掉。原创 2023-03-03 22:43:56 · 220 阅读 · 14 评论 -
【算法模板】位运算
位运算是二进制的运算,利用好有些题目将实现O(1)复杂度。&:按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0|:按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1^:按位异或 若参加运算的两个二进制位值相同则为0,否则为1~:取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0:右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数, 高位补0原创 2023-03-02 11:06:51 · 125 阅读 · 6 评论 -
【算法模板】差分
差分数组:首先给定一个原数组a:然后我们构造一个数组b :使得也就是说,a数组是b数组的前缀和数组,反过来我们把b数组叫做a数组的差分数组。原创 2023-02-27 22:02:36 · 150 阅读 · 5 评论 -
【算法模板】前缀和
前缀和的算法目的是仅用O(1) 的时间复杂度进行求数组一段区间的和。1、S[i, j] = 第i行j列格子左上部分所有元素的和紫色面积是指(1, 1)左上角到(i, j - 1)右下角的矩形面积, 绿色面积是指(1, 1)左上角到(i - 1, j )右下角的矩形面积。每一个颜色的矩形面积都代表了它所包围元素的和。从图中我们很容易看出,整个外围蓝色矩形面积s[i][j] = 绿色面积s[i - 1][j] + 紫色面积s[i][j - 1] - 重复加的红色的面积s[i - 1][j - 1] + 小原创 2023-02-16 19:03:30 · 159 阅读 · 9 评论 -
【STL】vector详细介绍(最全)
pop_back()和push_back()一样,都是从vector末尾进行尾行操作。pop_back()每次都会移除一个元素。需要注意的是,如果vector为空,使用pop_back()将会产生异常结果,因此需要empty()来确定vector不为空。定义具有5个重复整型元素,且给出的每个元素初值为1。vector 可以看作是数组容器,一个动态数组,对于指针不太熟悉,可以利用vector实现。a是一个空vector,默认初始化。a包含初始值个数的元素且赋予初始值。定义具有5个整型元素,无初值。原创 2023-02-14 15:57:11 · 253 阅读 · 3 评论 -
a[i]-‘0‘的意义
打个比方,a[1]是‘1’,字符‘1’的ascii值是49。而你想要输出1而不是‘1’(49),那么a[1]-'0'就是49-48,这样就把a[1]存的字符转换成了整数型。这里的a[i]绝对是字符串类型或者字符类型,而字符在电脑里使用ascii码表示,48=‘0’结论:为了将字符数组的数转换成为整数类型。见博主文章,【算法模板】高精度问题。原创 2023-02-14 14:45:49 · 952 阅读 · 3 评论 -
【算法模板】高精度问题
说在前面,高精度问题仅针对c;javap与python自带这个函数。将大整数视作一个数组,先存储低位数。vectoradd(vector &A,vector &B) //这里的&是为了提高速度,减少一次数组拷贝{ vector C; int t=0;//t是进位 for (int i = 0; i < A.size()||i < B.size(); i ++ ) // { if(原创 2023-02-14 17:24:19 · 161 阅读 · 6 评论 -
【算法模板】二分查找例题
根据前文所述的模板方法,通过几道十分典型的例题来深入理解二分(单调(sort)的)模板:如何check();两个模板何时用;stl的普及本博客例题均出自洛谷与部分博主整理目录例一:查找编号例二:A-B数对例三:高考报名例如:upper_bound(a,a+n,a[i]+c) - a 的值就是第一个出现的下标。原创 2022-11-08 16:12:56 · 422 阅读 · 5 评论 -
【算法模板】排序+二分
【代码】【算法模板】排序+二分。原创 2022-10-27 21:49:42 · 190 阅读 · 3 评论