- 博客(53)
- 收藏
- 关注
原创 《算法竞赛进阶指南》0x11栈
栈是一种“后进先出”的线性数据结构。栈只有一端能进出元素,我们一般称这一端为栈顶,另一端为栈底。添加或删除栈中元素时,我们只能将其插入栈顶,或者将栈顶元素取出。
2024-07-25 16:58:41
412
原创 《算法竞赛进阶指南》0x07贪心
因为奶牛按照minSPF排序,对于当前奶牛可用的任意两瓶防晒霜x,y,如果SPF[x]<SPF[y],那么后面的奶牛只可能出现,“x,y都能用”,“x,y都不能用”,“只有x能用”这三种情况,因此x的适用范围更广,当前奶牛选择y更优,因为把x留给后面的奶牛,未来的可达状态包含了选择x时未来可达状态。选择1之后,未来可以在任意位置建立新的设备,而选择2之后,设备的位置会被局限于l[i]-r[i]的位置,因此第1项选择包括了第2项选择未来能够到达的状态。贪心算法的正确性需要证明,常用手法如下。
2024-07-25 16:57:56
1064
原创 《算法竞赛进阶指南》0x06倍增
1.对于本题,如果我们采用二分的方法,最坏时间复杂度是On2logn。n/2logn/2n/4logn/4...1log1≤nlogn因此时间复杂复杂度为n∗nlognn2logn。≤T对于普通的倍增时间复杂度为Onlog2n。
2024-07-24 17:01:34
589
原创 《算法竞赛进阶指南》0x05排序
在程序设计中通常会用到以下排序:1.选择排序、插入排序、冒泡排序2.堆排序、归并排序、快速排序3.计数排序、基数排序、桶排序前两类排序时基于比较的排序,第一类排序的时间复杂度为On2,第二类排序的时间复杂度为Onlongn。第三类排序不直接比较大小,而是对被排序的数值按照位划分,分类映射等处理方式,其时间复杂度不仅与n有关,还与数值的大小范围m有关。
2024-07-24 17:01:17
1269
原创 《算法竞赛进阶指南》0x04二分
在单调递增序列a中查找≥x的数中最小的一个。在单调递增序列a中查找≤x的数中最大的一个。对于后者为什么是(l+r+1)>>1?如果也采用(l+r)>>1,那么r-l=1时,就有mid=l,如果进入l=mid分支,会造成死循环,如果进入r=mid-1分支,造成l>r,循环不能以l=r结束。mid=(l+r)>>1不会取到r,mid=(l+r+1)>>1不会取到l。可以利用这个性质处理无解的情况,把最初的二分区间[1,n]分别扩大到[1,n+1],[0,n]。这样如果最后停在了这个下标,则说明不存在。
2024-07-23 17:44:07
637
原创 《算法竞赛进阶指南》0x03前缀和与差分
Sij1∑iAjsumlril∑rAiSr−rl−1在二维数组中,可类似的求出前缀和,进一步求出部分和。
2024-07-23 17:43:38
1377
原创 《算法竞赛进阶指南》0x02递推与递归
一个实际问题的各种可能的情况构成的集合常称为”状态空间“,而程序的运行则是对于状态空间的遍历,算法和数据结构则通过划分、归纳、提取、抽象来帮助提高程序遍历状态空间的效率。递推和递归就是遍历状态空间的两种基本方式。
2024-07-22 18:29:00
561
原创 《算法竞赛进阶指南》0x01位运算
上面的是一个很有用的数,他是能满足以下两个条件的的最大整数。我们在程序设计时经常会用到memsetavalsizeofa))初始化一个int数组a,该语句把val(0x00-0xFF)填充到a的每个字节,而1个int占用4个字节,所以memset只能赋值出“每八位都相同”的int。综上,0x7FFFFFFF是memset是赋值出的最大值,但是当需要将一个数组中的数值初始化位正无穷时,为了避免加法算术上溢或者繁琐的判断,我们经常使用memseta0x3fs。
2024-07-22 18:28:38
691
原创 树的直径两种求解方式(dfs,dp)
先以任一点为起点进行一次搜索,搜索结束后的id为下一次搜索的起点,第二次搜索完成后,所得到的id与第一次的id之间的路径就是树的直径,长度为l。两次dfs的优点是:可以记录直径的起点,再配合一个dfs可以求出直径上的每一个点。缺点:无法解决负边权的情况。
2024-06-27 01:52:03
161
原创 最短路算法总结(dijkstra,flyod,bellmanford,spfa)
dijkstraheap−dijkstrabellmanfordspfafloydeuduvisueuduvisueudueuduvisuduOn2O((mnlogmOnmOkmnmOn3下附代码实现。
2024-06-23 01:56:39
748
原创 Part 6.2.2 最大公约数
如果两个数有一个共同的约数,那么这个约数就被称为公约数。最大公约数就是指这两个数的所有公约数中,最大的一个。求解两个数的最大公约数,可以采用欧几里得算法解决。
2024-06-21 00:42:44
1025
原创 欧拉函数的求解
其中以np结尾的序列重复了p^(k-1)次,每一次的循环与p ^k互质的数都有p-1个。筛法求欧拉函数实在筛法求素数的过程中同步进行的,关于线性筛求素数见。性质1的理解:一个数a是质数,前面的数b与a的gcd一定是1。性质1是性质2的特殊情况。性质2的理解:1,2,…
2024-06-20 01:36:50
191
原创 背包模型模板(0/1、分组、完全、多重)
题目描述给一个能承重V的背包,和n件物品,我们用重量和价值的二元组来表示一个物品,第i件物品表示为(Vi,Wi),问:在背包不超重的情况下,得到物品的最大价值是多少?输入第一行输入两个数 V,n,分别代表背包的最大承重和物品数。接下来n行,每行两个数Vi,Wi,分别代表第i件物品的重量和价值。输出输出一个整数,代表在背包不超重情况下所装物品的最大价值。样例输入115 44 103 712 129 8样例输出119。
2024-06-02 14:15:31
1025
原创 [NOIP2015 提高组] 子串
将本题状态定义dp[i][j][k]:A串前i个位置取字符,取出来k个字串,组合得到的新串正好与B串前j个位置相等的方案数。中出现的顺序依次连接起来得到一个新的字符串。请问有多少种方案可以使得这个新串与字符串。所有合法方案如下:(加下划线的部分表示取出的字串)注意:子串取出的位置不同也认为是不同的方案。有两个仅包含小写英文字母的字符串。个互不重叠的非空子串,然后把这。的长度,以及问题描述中所提到的。,每两个整数之间用一个空格隔开。一个整数,表示所求方案数。的字符串,表示字符串。的字符串,表示字符串。
2024-06-02 10:25:33
923
原创 Part 3.3 记忆化搜索
通过将已经遍历的状态记录下来,从而减少重复的搜索量,这就是记忆化搜索。动态规划的时候,记忆化搜索也是一种高效简洁的实现方式。
2024-06-02 00:26:14
576
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人