- 博客(199)
- 收藏
- 关注
原创 星际能量矩阵:树形 DP 的递归与非递归双解
维度DFS 递归版BFS 非递归版思维模型“先钻到底,再回来汇报”“先排好队,再倒着统计”代码量短小精悍稍长(需维护队列和数组)内存消耗占用系统栈占用堆内存稳定性深度过大时会崩溃极其稳定。
2026-02-13 22:16:23
489
原创 树型动态规划进阶例题1-僵尸网络的爆发(dfs+bfs实现)
维度DFS递归写法BFS非递归写法思维模型“钻下去,算完了再回来”“先按资排辈站好,然后从后往前报数”代码量短小精悍稍长(需维护队列和数组)内存消耗系统栈 (Stack)堆内存 (Heap)稳定性深度过大时崩溃 (Stack Overflow)极其稳定,只受内存大小限制适用场景快速验证、树深较浅工业级代码、ACM 极限数据卡常在日常练习中,写 DFS 没问题。但在正式的算法比赛或者工程项目中,如果你无法保证树的深度在安全范围内(通常<104),“BFS 序+逆序 DP”才是正解。
2026-02-13 07:00:00
490
原创 分离与合体(信息学奥赛一本通- P1573)
本文探讨了区间动态规划(DP)问题《分离与合体》的解题方法。题目要求将n个区域通过分离操作获得最大价值,并按照分离阶段顺序输出分割点。关键点在于:1)建立DP模型计算最大价值;2)使用BFS而非DFS按层序输出分割点,确保顺序正确;3)注意处理区间长度为1的特殊情况。文章提供了完整的C++实现代码,并强调题目要求的输出顺序是层序遍历,这是解题最易出错的地方。最终方案通过DP计算最大价值,并用BFS按分离阶段顺序输出分割点编号。
2026-02-12 11:07:51
687
原创 【例1-2】后缀表达式的值(信息学奥赛一本通- P1331)
带空格的字符串怎么读?千万别顺手写cin>>s!cin遇到空格会自动截断,你只能读到第一个数字。必须使用将整行包含空格的字符串全部读入。i--回退在用while循环提取多位整数时,while结束的那一刻,指针i其实已经指到了数字后面的那个字符(比如空格)。如果这时候你不写i--;,接着跑外层for循环的i++,就会硬生生跳过一个字符,导致逻辑彻底错乱。减法和除法的运算顺序(永远的痛)栈是“后进先出”的。你从栈里拿出来的第一个数d,其实是在原算式中靠右的数;第二个数c才是靠左的数。
2026-02-12 06:45:00
453
原创 计算(calc)(信息学奥赛一本通- P1356)
本文介绍了两种基于栈结构的中缀表达式计算方法。第一种方法采用两阶段处理:先将中缀表达式转换为后缀表达式,再计算后缀表达式结果。第二种双栈法直接边解析边计算,效率更高。文章详细阐述了调度场算法的实现原理,包括运算符优先级处理、括号匹配、多位数解析等关键步骤,并提供了完整的C++实现代码。特别强调了处理前导负号、运算顺序和多位数等易错点,帮助读者避免常见错误。两种方法都支持基本四则运算、整数除法和幂运算,能正确计算包含括号的复杂表达式。
2026-02-11 18:08:09
707
原创 计算机如何计算算式:调度场算法与逆波兰表达式
人在看一个算式(例如)时,可以一眼纵览全局,大脑会自动识别出括号和乘除号的优先级。但计算机在处理时是“近视”的,它只能从左到右一个个读取字符。为了解决优先级的问题,计算机并不直接计算我们手写的“中缀表达式”栈树等数据结构,将其转化为严格规定了执行顺序的形态。
2026-02-11 11:19:31
604
原创 【例 3】凸多边形的划分(信息学奥赛一本通- P1571)
定义dp[i][j]表示:将顶点i到顶点j构成的子多边形(即顶点序列)划分成三角形所能得到的最小权值和。目标:求dp[1][N]。边界条件:当区间长度为 2 时(例如dp[i][i+1]),只有两个点,无法构成三角形,代价为 0。__int128这道题是区间DP分割类的经典例题。思维转换:将几何图形的分割问题转化为线性区间的合并问题。高精度意识:在计算乘积时,一定要估算最大可能的数值范围,当long long不够用时,果断使用__int128(在允许的环境下)或手写高精度。%24w_i%24。
2026-02-10 21:57:54
604
原创 括号配对(信息学奥赛一本通- P1572)
定义dp[i][j]为:字符串中下标从i到j的子串中,最长合法子序列的长度。下标问题string的下标是从0开始的,所以循环范围是0到n-1。转移顺序:一定要先处理if配对的情况,再跑for k循环来更新最大值(或者像代码中这样,在for k中不断取max覆盖)。思维误区:有些同学会尝试直接定义dp[i][j]为“最少添加数”。如果定义为最少添加数,转移方程变为:这也是一种解法,但“最长合法子序列”的思路往往更容易理解,因为它把问题变成了我们在LIS或LCS中熟悉的“求最长”模型。
2026-02-05 22:17:07
543
原创 [NOIP 2006 提高组] 能量项链(信息学奥赛一本通- P1570)(洛谷-P1063)
断环成链:将数组扩大一倍是解决环形区间问题的通用技巧。它避免了复杂的取模下标操作,将环形问题转化为线性的区间问题。循环顺序:区间 DP 必须严格遵守枚举长度 -> 枚举起点 -> 枚举分割点的顺序,确保计算大区间时,其包含的小区间已经计算完毕。目标答案:在环形问题中,dp[1][N]不一定是最终答案,因为起点可能是环上的任意一点。我们需要遍历所有长度为N的区间取最大值。
2026-02-05 11:56:45
477
原创 【区间DP】括号序列:如何求解最长合法子序列?(POJ 2955)
我们定义dp[i][j]表示:字符串S中,从下标i到j的区间内,最长合法子序列的长度。子序列 vs 子串这道题求的是子序列,所以我们可以利用来进行拼接。如果是求子串(必须连续),则不能简单相加,需要更复杂的逻辑判断(通常涉及栈或更严格的 DP 状态)。为什么不需要专门处理“不选s[i]”的情况?有同学会问,为什么方程里没有写?其实,代码中的k<j;k++)已经包含了这种情况。当k=i时,,因为dp[i][i](单个字符)必然为0,所以这就等价于dp[i+1][j]。
2026-02-04 22:31:32
623
原创 【 例 1】石子合并(信息学奥赛一本通- P1569)
我们定义两个数组:dp1[i][j]:合并第i到第j堆石子的最小代价。dp2[i][j]:合并第i到第j堆石子的最大代价。数组大小要翻倍因为我们把数组复制了一遍,长度变成了2N,所以数组大小必须开到400以上(题目如果只开200会越界。循环边界优化第一层循环枚举len时,虽然链的总长是2N,但我们最终只需要长度为N的结果。所以len循环到n(即N) 就可以停止了,这样可以节省一半的计算时间。答案统计方式普通石子合并的答案是dp[1][n]。但环形问题的答案,是需要在2N的链上,
2026-02-04 22:21:20
816
原创 【例8.3】最少步数(信息学奥赛一本通- P1330)
多组数据重置本题虽然是一次运行求两个点,但相当于两组数据。在计算完A点后,必须使用清空状态数组,否则计算B点时会受到A点遗留数据的干扰。队列作用域如果将queue定义为全局变量,记得在每次bfs开始前清空它(或者像我代码中一样定义为局部变量)。方向数组写12个方向时容易手误写错正负号,建议按规律分组写(如代码中的注释所示),并在草稿纸上简单验证。
2026-02-03 22:41:41
540
原创 【例9.18】合并石子(信息学奥赛一本通- P1274)从暴搜到区间 DP:石子合并的四种写法
理解逻辑:看版本 2(记忆化搜索)。背诵模板:练版本 4(标准 DP)。希望同学们能通过这道题,彻底掌握区间DP的思想。
2026-02-03 22:15:30
676
原创 【例5.1】素数环(信息学奥赛一本通- P2110)
【题目描述】输入正整数n,把整数1,2,…,n 组成一个环,使得相邻两个整数之和均为素数。【输入】输入正整数n。【输出】输出任意一个满足条件的环。【输入样例】6【输出样例】【提示】数据满足:4≤n≤30。
2026-02-02 17:29:07
414
原创 菲波那契数列(信息学奥赛一本通- P1201)
数据范围:题目限制。第 20 项菲波那契数是 6765,远小于int的上限(约 21 亿),所以使用int是安全的。如果a到了50左右,就需要long long了。多组数据优化:注意代码中的a数组是全局变量。这意味着第一组测试数据计算出的结果(例如a[5]),在第二组测试数据中依然有效。编程习惯这一行既完成了赋值更新,又完成了返回值,体现了 C++ 语言的简洁性。%24a%24。
2026-02-01 22:01:13
263
原创 计数排序进阶:不仅要排序,还要知道它排在第几位(稳定性详解)
数据范围:计数排序受限于值域。本题中,空间完全够用。如果很大(如 10^9),则需要使用map或离散化,或者改用sort。空间换时间:这是典型的用空间换时间的算法。易错点前缀和循环的范围不要越界。最重要的一点:最后填充r[i]时,一定要写i=n循环到1。虽然顺着写在某些特定题目(不需要稳定性)也能过,但养成倒序遍历的习惯是理解基数排序的基础。%24a_i%24。
2026-01-29 22:21:10
318
原创 神秘大三角(洛谷P1355)
解决计算几何问题的关键在于“把几何关系转化为代数关系”。与其纠结复杂的角度判断,不如使用面积法。与其纠结浮点数的误差,不如全程使用整数运算。通过这一条核心公式,我们就能完美地将“内部/边上”与“外部/延长线”区分开来。
2026-01-28 22:01:56
921
原创 [USACO06NOV] Roadblocks G(洛谷P2865)
严格:题目中的定义决定了代码逻辑。如果是“非严格(允许相等)”,那么应该改为或者在降级时逻辑会有变化。本题要求严格,所以相等的距离直接丢弃。空间开销:由于是双向边,addedge调用了两次,所以边的数组 (vtexnxtwt) 大小必须是。只开100000会导致 RE。剪枝这句非常重要。因为一个点可能会被多次入队,如果取出的距离比我们已经找到的次短路还长,它就不可能更新任何点的最短或次短路了。%20w%24。
2026-01-27 22:06:49
778
原创 【模板】二维凸包 / [USACO5.1] 圈奶牛Fencing the Cows(洛谷P2742)
时间复杂度:排序耗时,遍历过程每个点最多进栈出栈一次,耗时。总复杂度为,完全能够通过的数据。空间复杂度:需要额外的数组存储排序后的点和栈,复杂度为。这道题是计算几何的入门必做题,掌握了Andrew算法,就掌握了解决凸包问题的金钥匙。编写时注意浮点数运算的精度以及共线情况的处理即可。
2026-01-27 08:05:13
565
原创 轰炸(洛谷P1142)
方法时间复杂度空间复杂度适用范围优点缺点暴力枚举O(N^3)O(N)思路简单,不需要排序数据大时必超时斜率排序O(N)效率高,利用了排序聚合信息细节多(GCD化简、方向统一)关键技巧回顾避免浮点数:在计算几何中,尽量避免直接计算k=dy/dx,因为浮点数有精度误差(0.333333!=1/3用最简分数(dx, dy)代表斜率是最稳妥的。方向归一化:向量(1,1)和(-1,-1)虽然方向相反,但在直线上是重合的。
2026-01-26 16:22:39
839
原创 多边形的面积(洛谷P1183)
本文针对二维平面内已知顶点坐标的简单多边形面积计算问题,探讨了“定点剖分法”的实现逻辑。通过数学推导证明了该方法与“鞋带公式”的等价性,并给出了基于 C++ 的标准实现,重点分析了计算几何中常见的数据溢出问题及精度处理。
2026-01-26 14:18:31
920
原创 最短路计数(洛谷P1144)
选对算法:带权图用 Dijkstra,无权图首选 BFS。不要什么都Dijkstra。空间管理:无向图的邻接表大小要乘 2。取模运算:计数类问题,凡是涉及加法的地方,都要时刻警惕溢出,步步取模。%20M%29%24。
2026-01-25 11:00:00
799
原创 路径统计(洛谷P1608)(最短路问题)
这道题是图论与动态规划结合的入门经典。解决它的关键在于理解Dijkstra的松弛过程本质上就是一种状态转移。同时,针对题目中“点序列唯一”的特殊限制,选择邻接矩阵而不是邻接表,利用min函数巧妙规避了繁琐的重边去重逻辑。
2026-01-25 07:00:00
1646
原创 [USACO08OPEN] Clear And Present Danger S(洛谷P2910)
这道题考察的是图论中最短路算法的灵活应用。当节点数N<=500且需要查询任意两点距离时,Floyd算法是首选,虽然它是O(N^3),但代码极短且常数小。题目给出的序列是必经点,但两个必经点之间可以经过无数个其他点来达到代价最小化。
2026-01-24 07:52:09
753
原创 素数密度(洛谷P1835) 区间筛模版题
L=1 的特判普通的筛法逻辑无法筛掉数字 1,因为没有素数能整除它。如果题目数据包含L=1,必须手动将es2[0]标记为合数,否则会多算一个。下标偏移我们在es2数组中标记时,使用的是es2[j - l]。切记不能写成es2[j],因为j可能高达21亿,直接访问会造成数组越界(RE)。不能筛掉素数本身在计算起始点k时,如果算出的k恰好等于当前素数prim[i]本身(这通常发生在L很小的时候),我们需要跳过它。因为素数本身不应该被标记为合数。代码中的if(j!=prim[i])就是为了处理这种情况。数据类型。
2026-01-24 07:00:00
550
原创 【深基7.例2】质数筛(洛谷P5736)
特性埃氏筛欧拉筛原理暴力划掉倍数仅通过最小质因子划掉复杂度O(N)(线性)重复标记有无应用场景普通判素、区间筛高性能判素、积性函数预处理对于本题10^5的数据量,两者都能轻松通过。但在10^7甚至更大的数据面前,欧拉筛才是永远的神。
2026-01-23 17:06:40
260
原创 绩效奖金分配
差分约束”的简化版。当我们遇到“A 必须排在 B 前面”、“A 的数值必须大于 B”这类具有依赖关系的问题时,首先要考虑是否能建立 DAG 模型。同时,代码中的处理方式,体现了动态规划的思想,即当前节点的状态由其所有前驱节点的最优状态决定。
2026-01-23 09:19:28
459
原创 强迫症冒险家的任务清单:字典序最小拓扑排序
这道题是拓扑排序的变种。如果是判断是否有环:用普通队列、栈、甚至数组模拟都可以。如果是求任意一个拓扑序:普通队列最快。如果是求字典序最小/最大的拓扑序:必须使用优先队列(堆)。
2026-01-22 21:23:44
827
原创 《课程表危机》:如何用拓扑排序检测“循环依赖”?
拓扑排序是解决依赖关系解析的标准工具。无论是大学选课、软件安装包的依赖管理(如 pip, npm),还是工程项目的进度安排,其底层逻辑都是判断图是否为 DAG(有向无环图)。
2026-01-22 20:56:03
648
原创 【模板】线性筛素数(洛谷P3383)
算法选择:数据量>10^7时,必须使用欧拉筛(线性筛),时间复杂度O(N)。内存敏感:数据量达到10^8时,int数组的内存消耗巨大。将标记数组改为bool或bitset。根据素数定理估算素数个数,不要盲目将prime数组开得和N一样大。IO 优化:使用cin.tie(0)和\n替代endl,在大规模查询下能显著提升速度。
2026-01-21 09:23:20
670
原创 哥德巴赫猜想(洛谷P1304)
特性埃氏筛 (Eratosthenes)欧拉筛 (Euler)原理暴力划掉所有倍数仅通过最小质因子划掉合数效率稍慢 (有重复操作)最快 (线性O(N))代码难度简单直观需要理解break的数学含义本题推荐完全够用最佳效率。
2026-01-21 06:00:00
1640
原创 公路修建(洛谷P1265)
摘要:本文介绍了求解平面上N个城市最小公路总长度的问题。通过分析题目规则,发现其实质是求完全图的最小生成树。针对N≤5000的数据规模,采用Prim算法实现,避免Kruskal算法可能导致的超时和内存问题。算法核心是利用隐式图策略,在需要时动态计算两点间距离,而非预存所有边。文章详细说明了算法实现、易错点(如浮点精度、无穷大设置)及注意事项,并提供了完整代码。最终解决方案的时间复杂度为O(N²),空间复杂度为O(N),能高效处理题目要求。
2026-01-20 16:12:20
745
原创 买礼物(洛谷P1194)
在后续的松弛操作 if(dis[j] > g[p][j]) 中,如果优惠价g[p][j]比a还要大,条件不成立,我们就保留了a这个更优解。如果你买了第 I 样东西,再买第 J 样,那么就可以只花 KI,J 元,更巧的是,KI,J 竟然等于 KJ,I。又到了一年一度的明明生日了,明明想要买 B 样东西,巧的是,这 B 样东西价格都是 A 元。先买第 2 样东西,花费 3 元,接下来因为优惠,买 1,3 样都只要 2 元,共 7 元。特别的,如果 KI,J=0,那么表示这两样东西之间不会导致优惠。
2026-01-20 12:01:03
655
原创 【模板】单源最短路径(弱化版)(洛谷P3371)
数组大小题目中N<=10^4,但 M<=5*10^5。邻接表h数组开N大小,但vtexnxtwt数组必须开M大小。SPFA 代码中最容易把边数组开小导致 RE。溢出问题虽然最终的最短路可能在int范围内,但在计算dis[u]+w的瞬间,可能会溢出int(如果dis[u]本身就是接近 21亿的INF)。建议在比较时强转。一句话总结:非负权图无脑用 Dijkstra (堆优化),负权图用 SPFA (注意防环),小图多源用 Floyd。
2026-01-19 14:37:20
1094
原创 【模板】单源最短路径(标准版)(洛谷P4779)
算法适用场景复杂度能否处理负权备注小图O(NM)能必TLE,仅作教学SPFA负权边图最坏O(NM)能随机数据快,容易被卡Dijkstra非负权图O(MlogN)不能正解,稳定高效建议:在没有负权边的题目中,直接Dijkstra。
2026-01-19 13:49:42
706
原创 【例4-13】奖金(信息学奥赛一本通- P1352)
建图方向一定要理清谁依赖谁。本题中“A比B高”意味着 A 依赖 B,所以边是B->A。如果建反了,求出来的就是最小值而不是最大值,逻辑会崩盘。判环题目中可能存在矛盾的建议(如 A>B 且 B>A)。Kahn 算法天然支持判环:只要算法结束后还有点没进过队列(即din[i]!=0),就是有环。数据类型虽然每个人奖金可能不多,但总奖金sum可能会超过int范围,使用long long是良好的编程习惯。初始化链式前向星的h数组记得初始化为-1。入度为0的点,初始奖金设为100。
2026-01-19 09:51:52
1026
原创 连接格点(grid)(信息学奥赛一本通- P1394)
【题目描述】有一个M行N列的点阵,相邻两点可以相连。一条纵向的连线花费一个单位,一条横向的连线花费两个单位。某些点之间已经有连线了,试问至少还需要花费多少个单位才能使所有的点全部连通。【输入】第一行输入两个正整数m和n。以下若干行每行四个正整数x1,y1,x2,y2,表示第x1行第y1列的点和第x2行第y2列的点已经有连线。输入保证|x1−x2|+|y1−y2|=1。【输出】输出使得连通所有点还需要的最小花费。【输入样例】2 21 1 2 1【输出样例】3【提示】【数据规模】
2026-01-18 18:54:33
719
原创 联络员(liaison)(信息学奥赛一本通- P1393)
这道题是Kruskal算法灵活运用的典范。遇到“必选边”、“已经存在的路”这类条件,直接在并查集初始化阶段处理掉。遇到“可选边”、“新建的路”,才放入算法流程中去贪心选择。这种“并查集预处理 + 贪心”的模式,是解决混合图连通性问题的好方法。
2026-01-18 16:05:29
462
原创 繁忙的都市(city)(信息学奥赛一本通- P1392)
算法核心逻辑获取最大边的方式推荐指数Kruskal边排序+并查集直接取最后一条加入的边 (mst[cnt].w⭐⭐⭐⭐⭐ (最直观)Prim优先队列+贪心过程中维护max值⭐⭐⭐⭐ (适合稠密图)这两份代码都已通过测试,是标准的算法模板。对于“瓶颈生成树”类问题,Kruskal 通常更简单直观,因为它天然基于边权排序。
2026-01-17 20:21:29
313
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅