自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(69)
  • 收藏
  • 关注

原创 拓补排序讲解

拓扑排序是对有向无环图(DAG)节点进行线性排序的算法,满足每条边的起点在终点之前。Kahn算法通过维护入度为0的节点队列实现,使用优先队列可得到字典序最小的排序。算法流程包括:初始化队列、处理节点并更新相邻节点入度、检查排序长度判断是否存在环。时间复杂度为O(n log n + m),空间复杂度O(n + m)。拓扑排序常用于课程安排、任务调度等依赖关系问题,同时具有检测图中环的功能。

2026-07-26 17:57:34 220

原创 线段树讲解

线段树是一种基于分治思想的树形数据结构,用于高效处理区间查询和修改问题。它通过递归将区间划分为子区间,形成完全二叉树结构,每个节点存储区间信息(如最大值、和等)。与ST表不同,线段树支持动态修改。核心操作包括:建树(O(n))、单点修改(O(log n))和区间查询(O(log n))。实现时需开4倍空间存储近似完全二叉树。模板包含节点结构、更新函数、建树函数、单点修改和区间查询函数,适用于解决各种区间统计问题。

2026-07-26 16:53:12 296

原创 ST表讲解

ST表是一种高效解决区间最值查询(RMQ)问题的数据结构,基于倍增思想,支持$O(n\log n)$预处理和$O(1)$查询。其核心是通过预处理所有长度为$2^k$的区间最值,将任意查询分解为若干预处理的子区间组合。状态转移方程为$dp[i][j]=\max(dp[i][j-1], dp[i+2^{j-1}][j-1])$。ST表适用于可重复贡献操作(如最大值、最小值),但不支持动态修改。查询时通过二进制分解区间长度或重叠区间法实现高效查询。空间复杂度为$O(n\log n)$,是静态区间查询的理想选择。

2026-07-26 15:59:04 320

原创 最近公共祖先(LCA)讲解

摘要 LCA(最近公共祖先)是指树中两个节点的最深公共祖先节点。文章介绍了暴力法和倍增优化两种求解方法。倍增法通过预处理每个节点向上跳2^j步的祖先表,将查询复杂度降至O(log n)。实现步骤包括:1) DFS预处理父节点和深度;2) 构建倍增表;3) 查询时先对齐节点深度,再同步跳跃寻找分岔点。关键点在于理解if(u==v)return u;的含义:当对齐深度后若节点重合,则该节点即为LCA。模板代码展示了完整实现,适用于大规模树结构查询。

2026-07-25 17:21:39 377

原创 倍增详细讲解

倍增(Binary Lifting)是一种通过二进制拆分将大步分解为若干2的幂次步的算法思想。其核心在于预处理每个点出发走2^j步的位置,查询时将步数k按二进制拆分快速跳跃。本文以"K步跳跃"问题为例,详细讲解了倍增的预处理(构建dp[i][j]表)和查询(按二进制位跳跃)过程,并提供了完整模板代码。倍增算法的时间复杂度为O(n log K)预处理和O(log K)查询,适用于大范围跳跃问题。该思想还可扩展应用于快速幂、LCA、ST表等场景,核心都是通过预处理2的幂次结果实现快速查询。

2026-07-25 16:09:10 182

原创 数论:排列数、组合数、费马小定理、逆元、同余定理

本文介绍了排列数、组合数的计算方法及其在模运算下的实现技巧。排列数$A_n^m$关注元素顺序,组合数$C_n^m$仅关注元素集合。针对模运算中的除法问题,引入逆元概念,利用费马小定理和快速幂算法高效求解。文章提供了完整的C++模板,包括阶乘预处理、逆元计算、排列组合数取模等核心功能,适用于算法竞赛等需要高效计算组合数的场景,帮助读者掌握这一重要数学工具的实际应用。

2026-07-24 19:05:13 643

原创 最短路问题——Dijkstra 算法

Dijkstra算法是一种解决非负权有向图单源最短路问题的贪心算法。其核心思想是:每次从未确定最短路径的点中选取距离起点最近的节点,用它更新邻居节点的距离,直至所有点被确定。为提高效率,采用优先队列(小根堆)优化,将复杂度从O(n²)降为O((n+m)logn)。关键实现包括:邻接表存图、无穷大初始化、距离松弛操作以及"懒惰删除"机制(跳过堆中的过时记录)。注意事项包括必须处理非负权图、正确设置无穷大值、避免堆误用为大根堆等。理解算法原理和代码细节比单纯记忆模板更重要。

2026-07-24 17:32:10 1450

原创 二分图讲解

本文系统介绍了二分图的定义、判定方法及应用。二分图是指顶点可划分为两个互不相交的集合,且每条边连接不同集合中的顶点。其核心判定条件是图中不存在奇环(边数为奇数的环),可用染色法(交替染黑白两色)检测。文章提供了DFS/BFS染色模板代码,并展示了如何通过染色统计连通块中两集合的大小。此外,还列举了二分图判定的经典题型(如分组问题、点覆盖问题)和常见易错点(如未初始化、图不连通等处理)。最后强调二分图的本质特征是无奇环,染色法是判定和应用的通用方法。全文约800字,涵盖理论、实现和应用场景。

2026-07-21 16:26:05 254

原创 并查集讲解

并查集是一种高效处理连通性问题的数据结构,核心操作为查找(get)和合并(merge)。通过数组维护节点间的父子关系,初始时每个节点自成一派。查找时采用路径压缩优化,将查询路径上的节点直接指向根节点,使后续查询接近O(1)。合并操作让不同集合的根节点建立隶属关系。典型应用包括判断连通性、统计连通块数(如网线连接问题)以及Kruskal最小生成树算法等。其优势在于代码简洁(约20行模板)且效率极高,是解决动态连通性问题的利器。

2026-07-21 16:18:36 308

原创 单调队列讲解

本文详细讲解了单调队列的原理、实现及其在滑动窗口最大值问题中的应用。主要内容包括 单调队列定义:一种保持元素单调递增或递减的数据结构,基于双端队列实现 核心操作: 入队时弹出破坏单调性的元素 出队时移除窗口外的元素 获取队头极值 经典应用:滑动窗口最大值(LeetCode 239)的O(n)解法 通用模板:封装成支持自定义比较器的类模板 扩展应用:最小值窗口、DP优化等场景 复杂度分析:每个元素仅入出队一次,总时间O(n) 关键点:存储下标而非值,注意窗口边界检查,根据需求选择单调方向(求最大值用递减队列)

2026-07-21 14:57:40 412

原创 经典题目——八皇后问题

本文介绍了经典的八皇后问题解法,要求在n×n棋盘上放置n个皇后,满足每行、每列和每条对角线上最多一个皇后。通过深度优先搜索(DFS)实现回溯算法,使用三个数组分别标记列和两个方向的对角线是否被占用。对于n=6的样例,程序会输出前三个解(如2 4 6 1 3 5)和总解数4。代码采用标记数组vis、d1、d2分别处理列和两条对角线约束,通过递归实现回溯,时间复杂度为O(n!)。输入输出样例展示了6×6棋盘的解格式。

2026-07-15 16:56:50 179

原创 关于二维/多维前缀和

将一维前缀和拓展到多维的情形,就是多维前缀和.常见的多维前缀和的求解方法有两种.。

2026-07-14 18:18:11 203

原创 结构体排序详解

结构体struct可以把多个不同类型的变量打包成一个数据类型。我们统一用node作为结构体名,这是个人习惯。a[1]就代表第1个学生的完整信息,a[1].s可以访问他的得分,a[1].na可以访问他的姓名。C++ 标准库的sort函数在头文件中,默认对基本类型(int、ll等)做从小到大升序排序,时间复杂度为 $O(n\log n)$,是算法竞赛的通用排序工具。但结构体没有默认的大小比较规则,直接对结构体数组排序会编译报错,因此必须我们自己写一个cmp 比较函数,告诉 sort 两个对象谁该排在前面。

2026-07-14 14:40:24 204

原创 差分详解

设原数组为a[1..n],构造差分数组d[1..n]d[1]=a[1](i≥2)

2026-07-14 14:27:45 525

原创 STL容器

STL容器是模板类,支持存储任意类型的元素(基础类型、自定义结构体、类对象等),通过模板参数实现类型通用。所有容器都遵循统一的接口规范,配合迭代器可直接使用STL算法(排序、查找、遍历等)。

2026-07-13 17:57:45 356

原创 广度优先搜索详解(BFS)

广度优先搜索(Breadth-First Search,简称BFS),也称为宽度优先搜索,是图与树结构中最基础的遍历算法之一。与深度优先搜索(DFS)的遍历逻辑不同,BFS采用的策略:从起点出发,先遍历所有与起点距离为1的节点,再遍历距离为2的节点,以此类推,逐层向外扩展,直到遍历完所有可达节点。

2026-06-06 17:13:17 528

原创 动态规划——背包问题

背包问题的核心场景非常简单:你有一个容量有限的背包,还有一堆物品,每个物品有重量、价值等属性,你要选一些物品放进背包,在不超过背包容量的前提下,最大化总价值。根据物品的不同限制,背包问题衍生出了非常多的变种,我们一个个来看。dp[i][j]:前 i 件物品,背包容量为 j 时,能获得的最大价值。选或者不选,根据物品的限制调整转移的顺序和条件。学会了这五种最常见的背包,你就已经搞定了 99% 的背包问题,不管是 LeetCode 刷题,还是算法竞赛,都能轻松应对。

2026-05-02 17:08:53 474

原创 关于前缀和

本篇讲解二维前缀和核心用法,配套完整可直接运行的 C++ 模板代码。先读入二维矩阵,提前预处理前缀和数组,利用公式快速算出任意矩形区间总和。单次查询只用 O (1) 时间,适合多组询问、静态矩阵求和题目。代码排版规范、变量清晰,全程开 long long 防溢出,边界写法标准,适合刷题直接套用。

2026-05-02 16:57:14 431

原创 优先队列讲解

本文详细介绍了C++中的优先队列(PriorityQueue),主要内容包括:优先队列的概念与特性(基于二叉堆实现,入队出队时间复杂度O(logn));基本语法与两种常用定义方式(大顶堆和小顶堆);核心操作(push、pop、top等);自定义数据类型的实现方法;经典应用场景(TopK问题、Dijkstra算法等);以及常见使用注意事项(如默认是大顶堆、pop不返回值等)。文章最后给出了一个完整的TopK问题解决方案示例。

2026-05-02 16:11:01 447

原创 c++深度搜索讲解及例题

对于c++深度优先搜索的基本概念和例题讲解

2026-04-11 14:29:31 173

原创 快速幂

摘要 快速幂算法通过将幂运算分解为更小的子问题,将时间复杂度从O(n)优化到O(logn)。该算法利用递归和分治思想,当指数为偶数时分解为平方运算,为奇数时转换为偶数情况处理。算法模板包含递归实现和取模操作,后者在计算大数幂时尤为重要,需要在每一步运算后进行模运算以防止溢出。快速幂适用于大指数场景,如b=1000000时的计算优化。

2026-02-06 20:08:45 88

原创 二分查找/答案题目

【代码】二分查找/答案题目。

2026-02-03 17:23:01 56

原创 c++oj奇异题目之坤坤与小黑子的智斗,无脑列举情况吓哭全世界80亿人

这谁绷得住,奇异题目题解

2026-02-01 16:44:44 273

原创 c++唯一分解定理模板

这段C++代码用于对一个整数n进行质因数分解。程序通过循环从2开始测试每个数i是否为n的因数,当找到因数时,将其所有出现次数输出。最后如果n仍大于1,则输出剩余的质因数。该代码适用于解决完全平方数问题和质因数分解问题,核心思想是通过试除法找出所有质因数。代码使用了标准输入输出,时间复杂度约为O(√n)。

2026-02-01 15:44:13 54

原创 结构体排序,双指针,单调栈

本文包含四个算法题解:1. 区间合并:合并有交集或首尾相接的时间段,输出合并后的区间。输入m个[l,r]区间,排序后合并相邻区间,时间复杂度O(nlogn)。2. 活动选择:选择最多不重叠活动。按结束时间排序后贪心选择,时间复杂度O(nlogn)。3. 最长无重复子序列:使用双指针和哈希表维护无重复区间,时间复杂度O(n)。4. 最大矩形广告牌:利用单调栈求每个高度的最大宽度,计算最大面积,时间复杂度O(n)。所有解法都针对大规模数据(n≤10^5)进行了优化。

2026-01-31 22:43:44 86

原创 洛谷 B4452 [GESP202512 四级] 优先购买 题目详解

【代码】洛谷 B4452 [GESP202512 四级] 优先购买 题目详解。

2026-01-24 17:11:59 288

原创 单调栈详解(含题目)

本文介绍了单调栈的原理和应用场景。单调栈主要用于解决寻找元素左右第一个比其大/小的元素的问题,通过维护单调递增或递减的栈结构实现。文章给出了五个典型题目及解法:1)"向左看齐"求左侧最近较小元素位置;2)洛谷P5788模板题求右侧第一个较大元素;3)"Aki的能量防护墙"通过左右单调栈求最大矩形面积;4)洛谷P2422结合单调栈和前缀和求最大舒适度区间;5)洛谷P2947求奶牛仰望对象。这些题目展示了单调栈在不同方向和不同单调性下的应用,时间复杂度均为O(n

2026-01-24 17:03:19 361 2

原创 数据结构有关的题目(栈,队列,set和map)

本文摘要包含6个编程题目及其解决方案: 栈顺序验证:检查给定出栈顺序是否合理,使用栈模拟进出过程; 括号匹配:验证括号字符串是否合法,通过栈结构实现; 约瑟夫环:模拟报数出圈过程,使用队列实现; 数组去重:利用集合自动排序和去重特性; 词频统计:统计单词出现频率,忽略大小写差异; 向左看齐:使用单调栈算法查找左侧最近较小元素位置。所有题目均提供完整C++代码实现,涉及栈、队列、集合、哈希表等数据结构应用。

2026-01-17 16:49:52 244

原创 图的存储

完全图:每两个顶点之间都有一条边连接 边数:n(n-1)/2。完全有向图:每两个顶点之间都有两条边连接 边数:n(n-1)非连通图:从某个顶点出发,至少有一个顶点无法到达。连通图:从某个顶点出发,可以到达其余任意顶点。树的边数:(n-1)

2025-12-20 19:32:53 163

原创 关于欧拉图

本文介绍了欧拉图的基本概念、性质和应用。欧拉图指存在经过每条边恰好一次的回路(欧拉回路)的图,而半欧拉图则指存在欧拉路径但无欧拉回路的图。关键性质包括:连通图中所有顶点度数为偶数(有向图入度等于出度),且可分解为不共边回路的并。文章详细证明了这些性质的等价性,并介绍了构造欧拉回路的Hierholzer算法,其时间复杂度为O(|E|)。此外,还讨论了欧拉图在计算机译码等领域的应用,并提供了C++实现模板。

2025-12-20 18:50:52 784

原创 c++快速幂

本文包含两个算法实现:1)快速幂取余算法,用于高效计算大数幂取模运算;2)输出数组前k大数的程序,使用快速排序降序排列后输出前k个元素。快速幂通过二进制分解指数优化计算,时间复杂度O(logb)。前k大数问题使用快速排序实现,时间复杂度O(nlogn),适用于n<100000的规模。两个算法均给出了完整的C++代码实现,包含输入输出处理。程序通过OJ测试,难度为入门级,适合算法初学者学习基本排序和数论算法。

2025-10-12 11:10:40 112

原创 课堂笔记(31)(图论)

2025-08-20 14:40:03 264

原创 课堂笔记(30)(堆与哈夫曼树)

2025-08-20 14:06:58 145

原创 课堂笔记(29)(树与二叉树)

2025-08-17 09:40:20 136

原创 课堂笔记(28)(二分,贪心和分治)

2025-08-17 09:23:12 243

原创 课堂笔记(27)(栈与队列)

2025-08-17 09:15:48 108

原创 课堂笔记(26)(排序)

2025-08-14 17:37:55 142

原创 课堂笔记(24)(前缀和与差分)

2025-08-10 12:10:51 184

原创 课堂笔记(23)(模拟枚举)

2025-08-10 12:05:12 145

原创 课堂笔记(22)(字符处理和系统函数)

2025-08-10 11:58:48 310

linkboy暗胞作品

暗胞

2025-10-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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