
XCPC模板
文章平均质量分 91
该专栏中整理了在XCPC上能够用到的一些算法模板
每天和狼对视一分钟能锻炼你的野性
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
河南萌新联赛2025第六场 - 郑州大学
暑期算法集训总结 通过六场萌新联赛的训练,算法能力有了明显提升,从最初的七八百名进步到三四百名。分享了以下题解: 整数购物(二分答案):处理大数时需转为字符串判断位数,使用log10方法WA的原因待查。 数字支配(贪心):优先输出9的简单思维题。 外卖大战(模拟):按照规则处理平台选择逻辑,注意未选次数统计。 糖果问题(规律):发现9^i对应10^i的规律,处理7的特殊情况。 哈气之门(滑动窗口):统计包含m种物品的子区间数量。 凹包问题(计算几何):通过叉积判断凸包性质,补充了凸包算法模板。 总结:两个月原创 2025-08-20 19:51:02 · 1110 阅读 · 0 评论 -
图论:Floyd算法
Floyd算法是一种解决多源最短路径问题的动态规划算法,适用于带权图(边权可正可负)。其核心思想是通过三重循环枚举中间节点k,更新每对节点i到j的最短距离。算法时间复杂度为O(n³),空间复杂度可优化至O(n²)。Floyd算法通过状态转移方程dp[i][j]=min(dp[i][k]+dp[k][j], dp[i][j])逐步求解所有节点间的最短路径。文章提供了Floyd算法的三维和二维实现代码模板,并指出对于源点较少的情况,多次Dijkstra可能更高效。最后给出了洛谷上的练习题和竞赛模板。原创 2025-08-18 19:04:18 · 1035 阅读 · 0 评论 -
河南萌新联赛2025第五场 - 信息工程大学
本文分享了河南萌新联赛2025第五场(信息工程大学)的部分题解,包括:A题(宇宙终极能量调和)的签到技巧,B题(中位数)的特判处理,C题(动态中位数)的对顶堆解法,F题(k进制后导零)的字符串模拟,G题(斐波那契数列奇偶性)的规律发现,K题(路径搜索)的DFS实现,I题(树形结构)的倍增LCA应用,以及H题(矩阵快速幂求斐波那契和)的矩阵运算方法。作者通过幽默的语言和详细的代码展示,记录了解题思路和技巧。原创 2025-08-13 19:34:45 · 1350 阅读 · 0 评论 -
背包九讲:动态规划经典问题全解析(二)
本文总结了背包问题的三种进阶题型:有依赖的背包、求方案数和求具体方案。有依赖的背包通过树形DP实现,将每个节点视为分组背包模型;背包方案数问题在01背包基础上增加方案数统计,需考虑最优解相等时的累加;具体方案求解则通过逆向遍历或记录状态转移路径来获取字典序最小的选择方案。文章提供了三种题型的代码实现模板,强调这些基础模板在实际竞赛中需要灵活运用。原创 2025-08-05 11:33:16 · 1059 阅读 · 0 评论 -
背包九讲:动态规划经典问题全解析(一)
本文介绍了动态规划中的经典背包问题,重点讲解了"背包九讲"中的前六种类型:01背包、完全背包、多重背包、混合背包、二维费用背包和分组背包。针对每种背包问题,文章详细说明了其特点、状态转移方程和实现方法,并配有相应的例题代码。其中,01背包需要逆序遍历容量防止重复选取;完全背包可正序遍历允许重复;多重背包有三种优化解法;混合背包需分类处理;二维费用背包增加一维状态;分组背包需确保每组只选一个物品。文章还特别强调了不同背包问题的遍历顺序差异及原因。原创 2025-08-04 18:22:51 · 845 阅读 · 0 评论 -
数论:卢卡斯定理
本文介绍了三种计算组合数C(n,k)模质数p的方法:1) 递推法(O(n²)),适用于小数据范围;2) 阶乘+逆元法(O(n)),利用费马小定理快速计算逆元;3) 卢卡斯定理,适用于超大n和k但p较小的情况。文章还提供了常用数论模板,包括素数判断、质因数分解、筛法、约数求解等,并通过容斥原理实例展示了如何统计区间内与特定质数互质的数字个数。这些方法覆盖了算法竞赛中组合数计算的主要需求。原创 2025-08-01 19:39:44 · 937 阅读 · 0 评论 -
图论:SPFA算法
本文介绍了SPFA算法(Bellman-Ford队列优化算法)及其应用。SPFA通过队列优化减少了Bellman-Ford算法的冗余操作,仅对需要松弛的边进行处理。文章给出了城市间货物运输问题的SPFA解法代码示例,使用邻接表存图,并通过标记数组和队列优化松弛操作。最后提供了完整的SPFA算法模板,包含初始化、建图、核心算法流程和结果输出,适用于求解带权图中的单源最短路径问题,特别适合XCPC竞赛选手参考使用。原创 2025-07-31 16:18:35 · 1059 阅读 · 0 评论 -
图论:Bellman_ford算法
本文介绍了两种求解单源最短路径的算法:Dijkstra算法和Bellman-Ford算法。Dijkstra算法仅适用于非负边权图,时间复杂度较低(优化后为O((n+m)logn)),采用贪心策略;而Bellman-Ford算法可处理含负边权(无负环)的图,时间复杂度较高(O(n×m)),基于动态规划思想,通过多轮松弛操作求解。文章详细比较了两者的区别,并提供了Bellman-Ford算法的实现模板,包括初始化、松弛操作和负环检测等步骤,适用于算法竞赛中处理负边权和检测负环的场景。原创 2025-07-29 12:10:33 · 994 阅读 · 0 评论 -
常用算法思想及模板
本文整理了算法竞赛中C++常用模板与解题思路,主要包括:1. 保留小数位数的cout格式化方法;2. 贪心算法在排队接水问题中的应用;3. 最长上升子序列的正反双向解法;4. 归并排序在逆序对问题中的高效应用;5. 高精度快速幂计算麦森数;6. 倍增法求LCA模板;7. 结合单调栈和倍增法的喷泉问题解法。文章通过具体例题展示了这些算法的实现细节,可作为算法竞赛的实用参考模板。原创 2025-07-29 10:26:55 · 1156 阅读 · 0 评论 -
图论:Dijkstra算法
本文介绍了Dijkstra算法及其两种实现方式,用于求解有向有权图中单源最短路径问题。朴素版采用邻接矩阵存储,时间复杂度O(n²),适合稠密图;堆优化版使用邻接表和小顶堆,复杂度O(mlogn),适合稀疏图。文章通过例题展示了算法应用,强调避免负权边和重复访问节点的注意事项,并提供了完整代码模板。Dijkstra算法通过贪心策略逐步确定各节点到起点的最短距离,是图论中的经典算法。原创 2025-07-26 18:00:46 · 914 阅读 · 0 评论 -
图论:最小生成树
本文介绍了两种最小生成树算法:Prim算法和Kruskal算法。Prim算法采用贪心策略,从节点角度构建最小生成树,通过维护节点到树的距离实现优化,适用于稠密图,时间复杂度为O(V²)或O(ElogV)。Kruskal算法通过边构建最小生成树,使用并查集判断连通性,按边权排序后逐步选择边,适用于稀疏图,时间复杂度为O(ElogE)。文章详细分析了两种算法的实现步骤、模板代码(包括邻接矩阵和邻接表版本)以及适用场景,并通过寻宝问题展示了具体应用。两种算法各有优势,应根据图的稠密程度选择合适的实现方式。原创 2025-07-25 19:05:16 · 1587 阅读 · 0 评论 -
图论:并查集
本文介绍了并查集(Disjoint Set Union)这一数据结构及其应用。并查集主要用于处理不相交集合的合并与查询问题,核心功能包括:1)合并两个集合;2)判断两个元素是否属于同一集合。文章详细讲解了并查集的实现方法,包括路径压缩优化、初始化操作、查找函数(find)、合并函数(join)和判断函数(is_same)。通过三道例题(寻找存在的路径、冗余的边、冗余的边II)展示了并查集的实际应用,并分析了不同情况下的处理策略。特别强调了并查集在判断连通性和检测环时的重要作用,为后续学习其他算法如Dijks原创 2025-07-25 13:22:40 · 1219 阅读 · 0 评论 -
图论:搜索问题
本文介绍了图论中常见的DFS和BFS搜索算法及其应用,重点讲解了岛屿问题的多种变体及解法。主要内容包括:1)孤岛面积计算,通过边界DFS消除非孤岛后统计剩余陆地;2)沉没孤岛问题,标记非孤岛后输出;3)水流问题,采用逆向双边界搜索;4)最大岛屿建造,通过编号和面积映射优化计算;5)岛屿周长统计,通过边界判断实现;6)字符串接龙问题,使用BFS构建转换图;7)有向图连通性检查。文章提供了详细的算法思路和C++代码实现,涵盖了图论搜索的典型应用场景。原创 2025-07-24 19:27:24 · 1045 阅读 · 0 评论 -
线性DP基础模板
本文总结了线性动态规划(DP)的常见模板与应用。重点介绍了最长上升子序列的O(NlogN)优化解法,通过二分查找维护dp数组。随后依次讲解了最长连续上升子序列、最长重复子数组、最长公共子序列等经典问题的解法模板。文章还涵盖了几个衍生问题,包括不相交的线、判断子序列、不同子序列计数等。最后详细解析了两个字符串的删除操作和编辑距离问题,通过状态转移方程展示了增删改操作的统一处理方式。这些模板对ICPC/CCPC等算法竞赛中的线性DP问题具有重要参考价值。原创 2025-07-19 10:56:21 · 626 阅读 · 0 评论 -
二叉树(建立 + 遍历 + 拓展)
本文分享了二叉树入门学习的心得,重点介绍了二叉树的构建、三种DFS遍历方式(前序、中序、后序)以及实际应用。通过4道洛谷题目(P4913、B3642、P1305、P3884)的代码解析,展示了如何求二叉树深度、实现不同遍历方式、处理字符二叉树以及计算节点间距离。特别强调了用后序遍历求最近共同祖先的技巧,并提供了通过父节点数组存储法优化查找的思路。文章以具体代码示例帮助理解二叉树的基本操作和递归思想。原创 2025-07-18 15:45:07 · 973 阅读 · 0 评论 -
河南萌新联赛2025第一场-河南工业大学
本文摘要:这是一组编程竞赛题解,包含多个算法问题及其解决方案。L题通过简单修改数组元素实现要求;C题通过数学公式直接计算结果;H题模拟蛇形矩阵填充;I题通过分析二进制字符串首尾字符判断结果;G题使用两种方法解决最大两段子段和问题;M题暴力枚举验证子序列条件;B题采用优先队列实现代价转移;A题运用斯特林数和阶乘计算排列组合。这些题目涵盖了基础编程、数学推导、动态规划和组合数学等知识点,展示了多种算法思维和解题技巧。原创 2025-07-17 19:15:36 · 1328 阅读 · 0 评论 -
string + 栈 & bitset & 可达性统计(拓扑排序)
本文总结了栈、bitset和拓扑排序的算法应用。通过"最优屏障"和"吐泡泡"两道例题展示了单调栈在处理元素匹配问题中的优势。介绍了bitset的常用操作,包括二进制转换和位运算,并通过"小红组比赛"、"简单瞎搞题"和"起床困难综合征"等题目演示了bitset在状态压缩和位运算优化中的应用。最后详细讲解了拓扑排序算法,通过"视频讲解"和"可达性统计"两道例题展示了如何利用原创 2025-07-17 15:21:33 · 1453 阅读 · 0 评论 -
完全背包-初识dp的美
本文总结了完全背包问题的动态规划解法。完全背包与01背包的区别在于物品可重复选取。解题关键在于确定循环顺序:若需要考虑元素排列顺序,则外层循环遍历目标值;若不需考虑顺序,则外层遍历物品。内层循环均需正序,以支持多次选取。通过状态转移方程(如dp[i]=min(dp[i],dp[i-w]+1))递推最优解。文章以单词拆分、完全平方数、零钱兑换等例题,展示了外层循环顺序对解法的影响,并强调完全背包内层必须正序遍历才能正确处理物品重复选取。原创 2025-07-15 16:41:09 · 833 阅读 · 0 评论 -
优先队列&赛后补题
本文比较了优先队列和集合(set)的使用场景,分析了两者的异同点。优先队列适用于需要频繁插入并自动排序但无需查找元素的场景,而set适合需要快速查找的有序集合。文章详细讲解了优先队列的实现原理(二叉堆)和两种类型(大根堆/小根堆),并通过动态中位数问题展示了对顶堆的应用。此外,还分享了Codeforces和牛客竞赛的解题思路,包括双指针技巧、滑动窗口优化等算法在具体问题中的应用,如处理循环移位数组的统计问题。最后通过预处理和逆向遍历等技巧优化了算法效率。原创 2025-07-14 15:13:48 · 736 阅读 · 0 评论 -
单调栈&单调队列【算法进阶】
本文总结了单调栈和单调队列的应用与实现。单调栈适用于寻找元素左右第一个大于/小于它的元素,如柱状图最大矩形问题;单调队列优化滑动窗口可用于求子数组极值问题。文章详细讲解了LeetCode 84、85、862等典型题目的解法,并提供了代码实现。通过预处理和单调性维护,这两种算法能将时间复杂度优化至O(N)。最后对比了两种滑动窗口的实现方式:双端队列适用于满足条件的子数组区间,单调队列则用于维护元素前的最值。原创 2025-07-12 10:42:23 · 795 阅读 · 0 评论 -
Set & 二分 -> 剑指算法竞赛
本文主要介绍了C++ STL中的集合容器set及其相关操作,以及二分查找算法的应用。set分为有序(set/multiset)和无序(unordered_set/unordered_multiset)两种,具有自动排序、去重等特点。文章详细讲解了set的定义、遍历和常见操作(插入、删除、查找等)。在二分算法部分,介绍了二分查找的前提条件、标准库函数(lower_bound/upper_bound)的使用场景,以及整数二分和浮点二分的模板实现。通过"进击的奶牛"和"切绳子&quo原创 2025-07-11 17:47:48 · 669 阅读 · 0 评论 -
Map容器&用map优化程序
本文总结了map的基础知识和操作,包括map的定义、增删改查、元素访问和遍历方法。通过5道编程题目练习了map的实际应用:1)同构字符串验证;2)字母解码;3)完美K倍子数组;4)和为K的子数组;5)叫号系统实现。重点讲解了map的两种遍历方式(迭代器遍历和快速遍历)以及注意事项,如自动排序特性导致的时间消耗问题、正确使用迭代器访问元素等。摘要概括了map的核心用法和典型应用场景,帮助快速回顾map的基本操作和解题思路。原创 2025-07-10 14:48:56 · 839 阅读 · 0 评论 -
单调栈(详解)
本文总结了单调栈的基本概念和应用。单调栈分为单调递增栈和单调递减栈,主要用于求解数组中元素右边或左边第一个大于/小于当前元素的值。文章通过多个例题展示了单调栈的具体应用,包括处理温度变化、计算雨水容量等场景,并提供了对应的代码实现。同时强调了单调栈的核心思想:在维护栈的单调性过程中,及时弹出无用元素,利用栈顶元素解决问题。最后指出需要通过大量练习来掌握这一数据结构,建议养成总结习惯以提高理解。原创 2025-07-08 14:42:27 · 836 阅读 · 0 评论 -
单调队列&双端队列
本文系统讲解了双端队列和单调队列的原理与应用。首先介绍了双端队列的基本操作(push_front/pop_front/push_back/pop_back)及其特点——支持两端操作。重点剖析了单调队列的核心思想:通过维护队列的单调性(递增/递减)来高效解决滑动窗口最值问题,时间复杂度O(N)。通过洛谷P1886滑动窗口模板题,详细演示了如何用数组模拟单调队列来求窗口最值,并给出了AC代码。此外,还介绍了单调队列在切蛋糕、逛画展、质量检测等题目中的典型应用,对比分析了存索引和存值两种实现方式的差异。最后总结了原创 2025-07-07 14:30:33 · 686 阅读 · 1 评论 -
C++中常用的STL容器
【代码】C++中常用的STL容器。原创 2025-04-15 11:55:39 · 305 阅读 · 0 评论