- 博客(51)
- 收藏
- 关注
原创 20251203 完全背包总结
其实现方式与01背包基本一致,唯一的区别是需要从小到大枚举背包容量。从大到小枚举时,较大的背包容量只能由较小的容量更新,且先处理大容量,因此每个物品只会被选取一次。从小到大枚举时,较小的背包容量可以更新较大的容量,且先处理小容量,因此可以实现物品的重复选取。这是一个标准的完全背包模板题,需要注意数据范围较大,应使用long long类型存储。枚举出的四次方数就是物品,重量为它本身,价值为1,求最小价值。首先枚举每一个不超过m的四次方数,然后就是完全背包。时,可获得的最小价值,那么答案为。
2025-12-05 13:30:20
211
原创 20251122 阅读检测
首先,可以初次判断是否不在该图形内,这个图形最大也就一个正方形,边长的一半也就是n,这就意味着如果该点如果在这个图形内的话,横坐标与纵坐标与中心点的距离不会超过n。其次,可以把整个图形看作一个圆形,可以算出斜着的近似半径长度z(这还是人话吗),接着横坐标与纵坐标与中心点的距离和取平均值要小于等于z。直接用两个桶数组统计每个字符的出现次数,最后判断是否相同就行了。用一个map数组来统计每个数出现了多少次,中途可以优化一下。全场最难的题,获得罚时的人数比最后一题还多。Hash,考试的时候差点没想出来。
2025-11-26 21:29:05
184
原创 20251119 01背包总结
首先,我们枚举每一个物品,然后再枚举背包容量,看目前的背包装不装的下这个物品,如果装得下,那么用装这个物品之前剩余的背包的容量的最值加上这个物品的价值更新目前的。上限为体力,背包容量为C,搬木石的体力为物体的重量,体积是价值,目标剩余体力最多,那么消耗体力就要越少,且要完成至少V的价值。由题面可知,背包容量和物品重量是同一种单位,每种物品只有一个,且可选可不选,是01背包。追求剩下体积最小,就是占用体积最大,也就是价值最大。表示当背包容量为 i 是可以获得的最值,那么答案就是。,其中 w 代表背包容量。
2025-11-25 18:11:28
179
原创 20251116 树状DP总结
树形DP是一种基于树结构的动态规划算法,利用树的递归特性进行状态转移。染色为0或1,且子树内叶子合法的最少染色数。
2025-11-22 22:14:12
242
原创 20251115 - 真(Hash) 总结
我从来不写前言,除了这次。这次,由于逆天之我写了7道Hash题,没一道使用Hash算法,且狡猾偷了两个首A,于是有了这篇文章,来讲述怎样(不)用Hash算法做Hash题。
2025-11-19 21:59:13
298
原创 20251109 树状DP总结
第二种,兄弟节点间有相互约束的树状DP,这种树状DP意味着兄弟节点间会互相干扰,就像给这几个兄弟节点分苹果,你分得多一点别人就分的少一点,你分得少一点别人就分的多一点。第一种,兄弟节点间无相互约束的树状DP,这种树状DP意味着兄弟节点之间互不干扰,你干你的,他干他的。树状DP,就是在树上进行动态规划,由于树的特殊递归属性,所以树状DP都是在树上进行的。2.状态:dp[i][j] 表示以 i 为根节点的子树保留至多 j 条边的最大边权和。题意:给定一棵树,n个点,有边权,至少保留q条边,求最大边权和。
2025-11-15 21:42:59
921
原创 20251110 kmp总结
KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,其核心优势在于利用已匹配信息来优化搜索过程。相比暴力匹配算法,KMP通过预处理和智能跳转机制,有效避免了不必要的重复比较。
2025-11-11 17:02:00
284
原创 20251105 线性DP总结
本文介绍了线性动态规划的基本思想和几个经典例题。首先以斐波那契数列为例说明动态规划的核心思想,随后详细讲解了最长上升子序列(B3637)、导弹拦截(NOIP1999)、木棍加工、摆花(NOIP2012)和最佳课题选择等问题的动态规划解法。每种问题都给出了状态定义、转移方程、初始条件和代码实现,特别强调了排序预处理和状态转移的关键技巧。其中导弹拦截问题还证明了"最少不上升子序列数等于最长上升子序列长度"的重要结论。这些例题涵盖了线性动态规划的基本应用场景和解题模式。
2025-11-11 13:26:38
631
原创 20251027 倍增总结
前缀和算法适用于静态区间和查询,通过预处理每个前缀和实现快速计算任意区间和。前缀和的两大局限在于无法处理不可减运算(如区间最值、GCD)和动态修改问题。树状数组支持单点修改和可减区间查询,基于lowbit运算实现。每个节点t[i]存储长度为lowbit(i)的区间和,前缀和可分解为至多。ST表适用于静态可重复贡献问题(如区间最值、GCD),特点是满足x与x运算结果仍为x。实现时需注意预处理对数表优化查询,将指数维度放在外层提高缓存命中率,并正确处理区间边界。个预处理的倍增区间,利用二进制分解实现高效查询。
2025-10-28 18:05:40
273
原创 20251025 分治总结
将复杂问题分解为多个相似子问题,通过递归求解子问题并合并结果获得原问题解。需满足问题可分解、子问题独立、解可合并三个基本条件。时间复杂度稳定为O(nlogn),空间复杂度O(n)来自临时数组。时间复杂度为O(2^n),空间复杂度O(n)由递归栈深度决定。
2025-10-25 23:06:27
268
原创 20251019状压DP总结
首先题目告诉我们有n盏灯,每盏灯可以是开或者关,有几个按钮,每个按钮按下之后可以使每盏灯开或者关,求最开始每盏灯都是开的,最少按几次按钮才能使所有等关上,如果无法实现就输出-1。这几个数的状态可以看作一个二进制数,每一个数的状态随之对应二进制数的每一个数位,那么每一种这几个数的不同状态组合随之对应一个二进制数。有时,仅仅只是有时,题目会让你求关于几个数从一个状态到另一个状态相关问题,那么弄一个。显然,这题bfs就能水过,但是有关状态压缩,所以值得一讲。的数组显然是不现实的,所以状压DP由此诞生。
2025-10-25 22:40:22
342
原创 20251020二分总结
map桶数组写法就是用一个map数组来记录每个数最早出现的下标,因为给的数组是单调不减的,所以只要看输入的数有没有被记录过,没记录过就更新就行了。其实都差不多,只不过lower_bound找的是序列里第一个大于等于这个数的下标,upper_bound找的是序列里第一个大于这个数的下标。这道题用的肯定是lower_bound,首先用lower_bound查一遍要找的数,然后看找到的数跟要找的数是不是一样的。具体用法,()_bound(数组名+起始下标,数组名+结束下标,要找的数)-数组名。
2025-10-24 23:11:00
186
原创 洛谷 P2949 [USACO09OPEN] Work Scheduling G
每次如果可以直接做,就把他直接丢进小根堆,当塞不下的时候,直接查看堆顶也就是最廉价的工作,看换不换,换的话就把堆顶给弹出去,然后把目前这个工作再塞进去就行了。首先,我们看每一个工作,如果目前这个工作可以做,就做,否则看这个工作是否比目前已经做了的工作中最便宜的更赚,是的话就替换掉,这样就能获得更大的利润。但是怎么每次都能挑出一个最便宜的呢?其实priority_queue会告诉你什么叫堆,毕竟不可能还拉个数组一直排序吧。时间复杂度O(n log n)
2025-10-21 21:29:45
245
原创 20251013 排列组合 & 容斥总结
容易发现,字母类型越少的字符串,不同的排列数量最少,那么题目既然要我们修改一个字符,我们肯定会挑数量只有一个的字符,这样可以减少字符类型,岂不妙哉!如果没有的话,就挑数量最少的字符,也可以。说了这么多废话,最终我们可以得出核心的写法,将出现次数最少的字符换成出现次数最多的字符就行了。我们可以发现当一个字符串重新排序成下划线全部到中间减号一边一半时,该字符串所表示的数字最大,所以首先统计每一个字符的数量,最后按最优方案输出。例如,还是小明班有10名同学,但这次要选3名去搞卫生,那么总方案数应是,也就是。
2025-10-16 21:20:01
821
原创 20251014 区间DP总结
显然是第二种区间DP,其次,我们会发现前三种操作其实可以结合到一起去,因为队伍里剔掉一个人就是在另一边加上一个人,没有区别。依然是区间DP,但是一段区间,他可能是从左端点走到右端点,也有可能恰恰相反,怎么办呢?,没办法,只能操作一次了,要么选择剔掉一个左边的,要么剔掉一个右边的,要么考虑把两端的人换成同样颜色的衣服,那么动态转移方程。当我们发现推着推着条件不够的时候,就需要增维,提高一个维度,这个维度就可以恰到好处的去补充条件。比如一个环1,2,3,4,破环成链就是1,2,3,4,1,2,3。
2025-10-14 20:43:56
718
原创 20251005 OI总结
首先把数组都接进来,然后钱数组排一边降序,最后把前面的几个数加起来就是答案了。当然不会写可以不用高精度,也可以骗50分(就比如我)。啊,不会不会,巨佬勿喷,蒟蒻的心理素质有点弱——高精度除法模板,用n去除以m-1就行了——本来可以拿满分的,就是不知道怎么想的——的原理,当然一顿dfs也可以把你吹飞。可能上帝不想让我成为250吧。简单到我都想不出怎么做了——
2025-10-05 21:51:17
146
原创 20251001约数 质数 同余总结
判断一个数是不是质数,最快的方式就是枚举2到sqrt(x)是不是这数的因数,如果都不是的话,这个数就是质数。当两个数a和b除以m的余数相同时,我们称a与b在模m下同余。例如,12和15在模3下就是同余的。当两个数拥有同一个约数时,这个约数就叫做这两个数的公约数,最大的公约数就叫最大公因数。当两个数拥有同一个倍数时,这个倍数就叫做这两个数的公倍数,最小的公倍数就叫最小公倍数。约数就是因数,当b/a,那么b就是a的约数,a就是b的倍数(a、b为整数)当一个数,它的因数只有1和它自己,那么这个数就是质数。
2025-10-01 11:56:12
253
原创 20250922 数位DP总结
windy 想知道,在 a 和 b 之间,包括 a 和 b ,总共有多少个 windy 数?要使用数位DP的题目通常是求一个区间内有几个符合条件的数,一般和每个数上的每一位有关系,就比如求一个数的每一位的数的和。就比如 789 ,第一部分为 1 ~ 9 和 10 ~ 99 的 windy 数的数量总和,用 dp 数组来表示就是。那么最终的答案就是1到 b+1 的 windy 数的数量减去1到 a 的 windy 数的数量。第二部分为 100 ~ 699 的 windy 数的数量,用 dp 数组来表示就是。
2025-09-24 18:39:47
556
原创 20250915状压DP
比如,有几盏灯,每个灯的状态很显然只有开和关吧!那么是否可以用二进制来表示这几个灯的状态呢?我们把二进制的第(i-1)位表示成第 i 盏灯有没有开,于是我们就可以把一个bool数组压缩成一个二进制数啦!首先,每盏灯的状态在前面已经讲述了,用一个二进制数来表示;然后,这道题可以直接裸bfs做,队列的每一个元素用一个结构体来表示,分别存储状态和步数;最后,细节在代码里。现给定所有按钮对灯的控制效果,求将所有灯关闭所需的最少按钮操作次数。状压DP说白了就是把很多个状态捆在一起然后压缩成二进制。
2025-09-19 15:45:42
311
原创 20250908 背包DP总结
~ 我们都有一个家,名字叫背包 ~顾名思义,背包DP是用来解决背包最值问题的。题目会给出背包的容量,以及几个物品的属性,比如重量,价值,限额等等,具体是什么看题目。01背包就是每个物品只能选择拿还是不拿。怎么实现呢?我们设dp[i]dp[i]dp[i]表示当背包容量为iii是可以获得的最值,那么答案就是dp[w]dp[w]dp[w],其中www代表背包容量。首先,我们枚举每一个物品,然后再枚举背包容量,看目前的背包装不装的下这个物品,如果装得下,那么用装这个物品之前剩余的背包的容量的最值加上这个物品的价值更
2025-09-14 21:24:07
880
原创 20250907 线性DP总结
咳咳,如果题目中有序列、数组,那么动态规划的状态就是一维的,也就是线性;如果题目中有网格、棋盘,那么动态规划的状态就是二维的。, Aₙ,需要找到两个下标i,j(1≤i<j≤n),使得Aⱼ - Aᵢ的值达到最大。顾名思义,就是线性相关的动态规划。HKE最近对序列研究产生了浓厚兴趣,他在研究过程中发现了一个有趣的问题:?其实应该很容易想到,。对于每一天i(1≤i≤N),太郎可以选择以下活动之一:。需要注意的是,太郎不能连续两天选择相同活动,否则会感到无聊。天在在家做作业可得到的最多快乐值,于是答案就是。
2025-09-07 20:57:01
1038
原创 P13929 [蓝桥杯 2022 省 Java B] 山 题解
嗯,可能是这个蒟蒻太蒟蒻了,想不到直接计算的数学的玄学的非常巨的做法,于是我直接从 2022 枚举到 2022222022。为什么不用看后半段是否单调不增呢?缩减一下题目的意思,问区间 [2022,2022222022] 有多少个数是回文数并且先单调不减,后单调不增。如果前半段是单调不减的,那么后半段就是单调不增的,除非这个数不是回文数,那么我们就会判断出,这个数不符合要求。当然啦,这个代码并不会 AC ,会 TLE ,于是我们就只能耐心的等待他得出的结果,然后直接输出。
2025-09-04 18:23:11
415
原创 20250901 搜索总结
就是通过一定的顺序经过点之间的边到达图上的其他点。深度优先搜索(DFS)主要特点是不撞南墙不回头,就是每次找出一条没有走过的边继续搜索,直到没有边可走了就开始回溯,回到上一个点,继续搜索。广度优先搜索(BFS)他的搜索策略就不一样了,它首先把周围的点跑一边然后再找离他最近的一个点继续广搜。首先从一个点出发,把他放到队列里,然后每次拿到队列开头,看可以到哪里去,就把能到的点放到队列里去,循环直到队列为空。由于队列遵循先进先出的原则,距离起点较近的节点会优先入队,因此每次取出的队头始终是离起点最近的节点。
2025-09-03 20:36:59
560
原创 洛谷P13849 [CERC 2023] Equal Schedules题解
的值班起止时间,第一张表由一行六个减号结束,紧接着是第二张表,由一行六个等号结束,最后输出每个人前后两张表工作时长的差,如果前后工作时长没有任何区别,就输出。这道题按照题意模拟即可,我们只需两个map数组统计,每个人在两个列表中分别工作了多少时间,然后输出每个人前后两个表工作时长差。首先,缩减一下题面:有两个表,由多行数据组成,每行格式为。
2025-08-27 20:03:55
1164
原创 20250822 组题总结
例如,身高170厘米和180厘米的两个人,当m=10,k=5时,可以分别站在第5和第7级台阶上(高度差为10厘米,等于身高差)。扶梯上有n名乘客,共有m级台阶,编号从1到m,第i级台阶的高度为i*k厘米。这题考验你对树的理解,因为每个节点的父亲是唯一的,所以只要从n下标开始while,每次找到父亲,直到1号点。现在给定包含n个身高的数组h,其中h[i]表示第i个人的身高。由题目可得,字母都在同一列,并且不会间断,所以不用什么复杂的判断,遇到字母直接加进字符串就行了。给定一个长度为 n 的整数数组 a。
2025-08-22 21:04:59
947
原创 20250821 圆方树总结
最终,圆方树上任意两圆点间的路径距离即为它们对答案的贡献值。通过树形DP统计每个顶点在路径中出现的次数与其权值的乘积,即可求得最终答案。中任意选取两点,它们之间的所有简单路径的并集恰好构成该点双。具体来说,两点间简单路径经过的顶点集合等于路径上各点双的并集。这就是圆方树,建树本身不难,会求点双就能用把圆方树建出来,难点在于如何恰当的赋权值使得在圆方树上能求解原问题。第一步,我们要找到所有的点双,这张图总共有5个点双;之间的路径覆盖的顶点集合包括路径上的所有。,注意,这是虚构的点,然后,在。
2025-08-21 22:45:39
483
2
原创 20250820 比赛总结
然后再把字符串中的所有A字符转换成B字符,最后看有几种不同的字符,输出不同的字符数乘上该字符串的长度就行了。嗯,也不知道具体怎么写,或许是线段树吧,或许是ST表吧……要是多10分就能进前10了!其实就是枚举,但我怎么就是没做出来呢?模拟中参杂着一点字符串的气息。不错不错,骗到了10分!狡猾,连个暴力分都不给。
2025-08-21 10:49:17
223
原创 20250819 强连通分量,边双总结
连通分量:无向图中所有节点相互连通的子图。弱连通分量:将有向图所有边视为无向边后,所有节点相互连通的子图。强连通分量:有向图中任意两个节点互相连通的子图。点双连通分量:连通子图中删除任一节点后,其余节点仍保持连通。边双连通分量:连通子图中删除任一条边后,其余节点仍保持连通。
2025-08-19 22:01:30
1470
原创 20250818 割点 割边 点双总结
为割点,看把这个点去掉后连通分量是否增加了。只要用一个栈记录已访问顶点,当回溯到割点时提取对应的点双连通分量就行了。以上图有两个连通分量,分别为{1,2,3,4,5}和{6,7}。就是从一张图里选出几个点和几条边,如果子图里面的各个点互相。了,说明这个点是割点,也就是说这个点原来所处的连通分量。和割点同理,只是从去掉一个点变成了去掉一条边。大致和割点都差不多,只是判断条件不一样,改成了。在一张图里,去掉一个点,如果连通分量数量。,连通子图的点和边数量尽可能大就是。了,分裂成了更多的连通分量。
2025-08-18 22:23:42
610
原创 20250815组题总结
具体来说,队伍的位置编号为1到n,其中1号位置的人最先接受服务。若在x时刻,第i个位置是男生而第(i+1)个位置是女生,那么在x+1时刻,这两个位置会互换:第i个位置变为女生,第(i+1)个位置变为男生。最初,孩子们按照进入食堂的顺序站好。找规律,因为我们可以发现,只要每次挑出一个0出来,可以比原来直接加上去多1,所以我们先对每一个0进行一次mex操作,其余的数直接sum起来就行了。然后我们就要对这个数组进行更新,循环找出位于这个数之前的数,让他们的最早出现的位置++,最后再让这个数最早出现的位置变成1。
2025-08-16 15:38:36
714
原创 20250814 最小生成树和重构树总结
然后循环n-1次,每次找出dis数组里值最小且没被选过的一个点,把它拿出来看看他有哪些边,如果连向的点也没被选过,就更新他的dis。循环前把cnt设为n,每次要挂边时,cnt++,然后让cnt当u和v的父亲,同时更新并查集数组和记录每个cnt的左儿子节点和右儿子节点的距离的b数组。接着,我们循环把所有的边拿出来,查看他们的祖宗是否相同,否的话就把这条边挂在用于LCA的树上。dis数组={0,\infty, \infty,\infty,\infty$}这时,我们需要扩域,也就是建造虚拟节点,cnt。
2025-08-14 23:09:24
1209
原创 20250813比赛总结
因为两个点的先序遍历的顺序只跟lca有关系,所以如果v是u的祖先,那么u一定在v前面,反过来同理;否则概率就是50%。确实是暴力,但我是用数组统计每个可能出现的数,于是3AC 3WA 4TLE。拿到全部分应该直接按照题目模拟。暴力dfs,由于忘记优化所以60pts,而且还没开long long。暴力本来指望有个30分,但全都超时了,正解是DP。
2025-08-13 23:18:13
254
原创 20250812 全源最短路总结
如上图,假设我们要求1到3的最短路,先从1走到2,此时边权和为3+h[1]-h[2],接着再从2走到3,此时总边权为3+h[1]-h[2]-2+h[2]-h[3],结合起来就是h[1]-h[3]+1。h是从超级源点出发到每个点的最短距离,所以对于任意一条边(u, v, w),一定有hv <= hu + w,上式移项得w + hu - hv >= 0,即新图中的边权非负。我们可以把h想成一种势能,因为势能只跟起点和终点有关,所以dijkstra求出答案后只要减去h[u]加上h[v],就能得出最终结果。
2025-08-13 10:27:25
1025
1
原创 20250811 单源最短路总结
和点核心的dij不同,bellman在松弛时不是以点作为单位来松弛,而是在一轮松弛中依次松弛所有边,直到找到所有点的最短路(或发现有负环)为止。SPFA是基于bellman算法的队列优化,在随机图和一些有特殊性质的图上表现优秀,但复杂度上界和bellman相同,也是。最短路问题是一类经典的图论问题,主要是求解有权图上两点间的最短距离。2、用起点到点u的距离dis[u],尝试更新u的邻居们的最短距离。在每一轮循环中,我们尝试用每一条边更新这条边的终点的最短路,复杂度。
2025-08-12 10:11:33
1705
原创 20250807直径,重心,LCA总结
从任意一点作为根节点出发做DFS,求每个节点的子树节点数,就能知道每个节点作为根节点时的子树大小,向下的子树大小直接统计,向上的子树大小等于。我们按照DFS的顺序,记录每个节点。的结构,和一维的序列比起来,树的结构更加复杂,我们在思考树上问题的解法时,也常常会先考虑一条。●把两棵树用一条边连起来,形成的新的树的重心在原来两树重心之间的路径上。选择一个合适的根节点,使得根节点的子树能够尽可能的“均匀”,区间内距离根节点最近的节点,该节点的父节点即为lca。求得最远的不相同的祖先节点,该点的父节点即为LCA。
2025-08-08 10:43:17
1229
原创 20250805 分块 莫队总结
分块和莫队是两种高效的区间查询算法。分块通过将序列分成若干块,预处理块信息,实现查询和修改操作的平衡,时间复杂度为O(q*(B+n/B)),空间复杂度O(n)。莫队算法则通过离线处理和对查询的特定排序,利用相邻区间的转移来优化复杂度,适用于满足特定转移条件的查询问题。两种方法都体现了"优雅暴力"的设计思想,在特定场景下能有效解决树状数组和线段树难以处理的问题。
2025-08-05 23:44:16
741
原创 20250804 倍增&ST表 树状数组
处理出倍增数组之后,对于任意一个区间查询,我们都可以找到两个已经预处理好结果的区间的并集等于原区间,所以对这两个区间的结果做。对于任意一个区间,可以把这个区间拆成最多log2n个倍增数组中计算好的区间。前缀和是预处理出每一个前缀,对于任意一个区间,我们都可以用两个前缀和之差来表示这个区间内元素之和。按位或是每个二进制位上取最大值;,所以只需要向更大的位置寻找包括第i个位置的区间,对每个区间做出修改即可,这一步也可以使用。因为交集的部分多次运算还等于本身,所以凑出的两个区间即使有交集,也不会影响最终的答案。
2025-08-05 11:15:01
1667
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅