自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

布心老混子

二流工业大学的三流计算机本科 四流英国学校的五流计算机硕士 不入流的信息技术老师

  • 博客(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

原创 迷宫(信息学奥赛一本通- P1215)

多组数据记得memset。分清楚什么时候该回溯,什么时候不该。起点和终点的合法性要先检查。

2026-02-02 17:52:10 330

原创 【例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关注的人

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