- 博客(14)
- 收藏
- 关注
原创 树上启发式合并学习笔记
本文介绍了离线处理静态有根树子树问题的启发式合并算法。该算法通过优先处理重子节点并保留其信息,再处理轻子节点,将原本O(n²)的暴力解法优化至O(nlogn)。核心步骤包括两次遍历轻子树和保留重子树信息,利用了树剖中"轻边不超过logn条"的性质,确保每个节点最多被处理O(logn)次。算法适用于统计子树颜色、路径异或等可通过合并子树信息求解的问题,显著提升了处理效率。
2025-11-18 22:37:04
625
原创 洛谷 P8137 [ICPC 2020 WF] ‘S No Problem
本文研究树形结构上使用两条不交路径覆盖所有边的最小代价问题。通过分析单吹雪机情况,推导出双吹雪机的最优解应为总边权和的2倍减去两条最长不交路径长度之和。采用树形DP方法,定义四种状态分别表示子树中的最优路径组合,并通过状态转移方程求解。最终时间复杂度为O(n),空间复杂度O(n)。实验结果表明该算法能有效求解该问题。
2025-10-24 22:10:49
357
原创 洛谷 P13823
本文提出了一种求解图中节点到连通块内最大权值节点的最小变化次数的算法。首先将原图转化为无向图,并定义路径变化次数的概念。通过DFS找出各连通块及其最大权值节点,然后利用改进的拓扑排序算法计算每个节点到最大权值节点的最小变化次数。算法在遍历过程中动态更新路径方向和变化次数,最终输出每个节点的最小变化次数。该方法有效解决了在有向图中计算特定路径属性的问题。
2025-10-06 17:14:51
290
原创 51nod 1815 调查任务
该题目考察在DAG上寻找路径中的严格次小值问题。通过Tarjan算法将原图缩点为强连通分量,每个分量维护最大值和次大值。然后进行两次拓扑排序:第一次用路径上的最大值更新各分量的次大值,第二次传递最优解。最终每个城市的经济状况即为所属强连通分量的答案。算法时间复杂度为线性,能够处理大规模数据。
2025-10-06 17:13:56
1118
原创 扫描线学习笔记
本文介绍了计算矩形面积并和周长并的算法。对于面积并问题,通过扫描线算法将重叠矩形分解为无重叠部分,使用线段树维护当前覆盖宽度。对于周长并问题,在面积并算法基础上,额外统计独立横线数量并计算竖线长度变化。两种算法的时间复杂度均为O(n log n),适用于大规模数据。文章提供了对应的模板题代码实现,详细说明了线段树的维护方式和统计方法。
2025-07-25 21:24:40
900
原创 ST 表学习笔记
ST表是一种用于高效解决静态区间最值查询的数据结构,通过预处理倍增信息实现O(1)查询。其核心思想是将区间划分为两个有重叠的2^k长度子区间,通过预处理每个起点开始的不同长度区间的最大值。初始化时采用动态规划,st[j][i] = max(st[j][i-1], st[j+2^(i-1)][i-1])。查询时利用对数运算确定合适的k值,合并两个子区间结果。相比线段树,ST表实现更简单、常数更小,特别适合没有修改操作的场景。文末提供了洛谷模板题的实现代码。
2025-07-25 21:04:33
949
原创 Manacher 学习笔记
本文介绍了求解最长回文子串的两种方法。暴力法通过以每个字符或空隙为中心向外扩展,时间复杂度为O(n²)。更高效的Manacher算法通过插入分隔符统一处理奇偶长度问题,利用回文对称性避免重复计算,将复杂度降至O(n)。算法核心是维护一个p数组记录每个中心的最长回文半径,并通过maxid和id变量优化扩展过程。最终p[i]-1即为原串中的回文长度。模板代码展示了如何实现该算法,其线性复杂度来自对字符串的单次遍历和有限次数的暴力扩展。
2025-07-17 22:41:42
1101
原创 KMP 学习笔记
本文介绍了字符串匹配问题及其解决方案。首先,暴力匹配算法通过枚举文本串中的每个位置并逐个比较字符来判断模式串是否出现,但其时间复杂度为 (O(|s| * |t|)),效率较低。随后,文章详细介绍了 KMP 算法,该算法通过预处理模式串的 nxt 数组来记录每个前缀的最长公共前后缀长度,从而在匹配过程中利用已匹配信息跳过不必要的比较,将时间复杂度优化至 (O(n + m))。KMP 算法的核心在于通过 nxt 数组的构建和应用,实现高效的字符串匹配。
2025-07-17 16:55:40
818
原创 Nim 游戏学习笔记
Nim游戏及其阶梯变形的胜负判定方法。公平组合游戏Nim中,n堆石子的异或和为x:若x=0则先手必败,否则必胜。阶梯Nim则将奇数层石子视为普通Nim堆,偶数层不影响结果,只需计算奇数层异或和即可判定胜负。通过分析不同操作对x值的影响,证明了最优策略的存在性。
2025-06-05 22:25:33
1053
原创 一些导致 WA/MLE/TLE 的坑点
本文总结了几个算法竞赛中常见的错误与优化技巧:1.避免使用pow函数计算快速幂以防精度问题;2.节点数多时应使用链式前向星而非vector存图防MLE;3.bool类型不能用%d输入;4.关闭同步流时避免使用递归快写函数;5.注意点双和边双处理时的特殊要求;6.警惕自增运算符在复杂表达式中的使用顺序问题。这些经验教训来自洛谷多道题目的WA/TLE/MLE测试案例。
2025-03-02 21:27:24
499
原创 Tarjan 求解 LCA
本文介绍了使用Tarjan算法离线求解最近公共祖先(LCA)的方法。该算法通过DFS遍历树结构,并利用并查集维护已访问节点的祖先信息。在回溯过程中合并子节点到父节点的集合,当处理查询时,若两点均已访问,则通过并查集快速找到其LCA。算法时间复杂度接近线性(O(nα(n)+Q)),其中α(n)为反阿克曼函数。文中提供了完整的C++实现代码模板,包括邻接表建树、查询处理和异或和计算等核心功能,适用于处理树结构的路径查询问题。该算法高效且易于实现,是解决LCA问题的经典方案。
2025-02-09 22:16:19
434
原创 盘点我那些因概念理解不清而 TLE 的题(洛谷)
本文分享了两个算法优化案例。第一个案例通过Tarjan求强连通分量后采用DFS更新最大值,但遇到DAG结构导致时间复杂度超预期,最终通过改进DFS和标记处理解决了问题。第二个案例在KMP算法实现中,原方案在处理重复字符时出现O(n^2)复杂度,通过调整跳转逻辑优化为线性复杂度。两个案例都体现了对算法核心思想的深入理解以及调试分析的重要性,特别是数据结构特性和边界条件对性能的关键影响,最终通过针对性优化成功解决问题。
2025-02-08 23:07:06
922
原创 Tarjan 与连通性问题
1. 强连通分量的Tarjan算法实现,通过时间戳和栈结构识别强连通子图;2. 缩点操作将同一强连通分量节点合并;3. 割边识别条件及边双连通分量求解;4. 割点判断和点双连通分量求解,处理自环等特殊情况;5. 2-SAT问题的解法,通过建立蕴含图并检查强连通分量进行可行性判断。
2025-02-08 22:17:57
1007
原创 洛谷P2812/P2746解题思路
本文讨论了如何计算有向图中选择最少母机数量及添加最少边数使图强连通的问题。作者使用Tarjan算法进行强连通分量缩点,统计入度为零的强连通分量数目作为母机数量(ans1)。对于添加边数,最初错误地统计出度为零分量数(ans2),后发现需要取入度与出度零分量数的较大值。最终通过特判处理环和孤立点情况,得到正确解法:当图为单个强连通分量时无需加边,否则取max(ans1,ans2)。该解法通过多次修正错误,最终解决了题目要求。
2025-02-08 21:44:58
1139
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅