- 博客(83)
- 收藏
- 关注
原创 线段树01
线段树是一种基于分治思想的二叉树结构,用于高效处理区间统计问题。其核心操作包括:build(建树)、push_up(自底向上更新节点)、modify(单点/区间修改)、query(区间查询)和push_down(延迟标记处理)。线段树通过将区间递归二分实现O(logn)复杂度的操作,适用于区间和、最值等统计需求。区间修改时引入lazy-tag技术优化性能,标记暂时存储修改操作,仅在必要时下传给子节点。线段树采用数组存储,空间复杂度为O(4n),功能比树状数组更强大但实现稍复杂
2025-08-22 23:21:54
1022
原创 哈希和字符串哈希
哈希表是一种通过哈希函数将复杂数据映射到较小值域的数据结构,使用链表处理冲突(开散列法)。其核心操作包括计算哈希值和遍历链表查找/更新数据。设计良好的哈希函数能均匀分布数据,使操作时间复杂度接近O(1)。文中以统计整数出现次数为例,演示了哈希表的具体实现,并介绍了字符串哈希算法——将字符串视为P进制数取模,支持快速计算子串哈希值。通过例题(如雪花识别、回文子串查找)说明哈希技术的实际应用,包括双哈希防冲突、前缀哈希处理子串查询等技巧。典型场景下,预处理O(n)后即可实现O(1)的子串比较。
2025-08-22 23:19:21
1291
原创 Trie 树(字典树)
字典树(Trie树)是一种高效处理字符串的多叉树结构,广泛应用于字典存储、字符串检索、前缀统计等场景。其核心优势在于通过共享前缀减少字符串比较,提高查询效率。字典树的基本操作包括插入和查询,时间复杂度与字符串长度线性相关。针对不同需求,可通过优化存储结构(如孩子兄弟表示法)处理大规模字符集问题。典型应用包括字符串检索、前缀统计、异或运算优化等。字典树在搜索引擎词频统计等实际系统中具有重要价值,能有效平衡时间与空间复杂度。
2025-08-22 22:58:23
921
原创 DFS序与树链剖分入门
本文系统介绍了树链剖分算法及其在树结构数据处理中的应用。主要内容包括:1. 基础概念:详细解释了DFS序的定义、性质及其在将树结构转化为线性结构中的作用,包括子树连续性、括号化定理等关键性质。2. 重链剖分:重点阐述了重链剖分的核心思想,通过定义重儿子、轻儿子、重边、轻边等概念,将树分解为O(logn)条重链,实现路径查询的高效处理。3. 算法实现:给出了完整的预处理和查询实现模板,包括两次DFS遍历、线段树维护以及路径/子树更新查询的具体方法。4. 复杂度分析:论证了算法的时间复杂度(预处理O(n)
2025-08-22 22:52:54
1088
原创 Tarjan 求有向图的强连通分量
Tarjan算法是一种基于深度优先搜索的线性时间算法,用于求解有向图的强连通分量(SCC)。该算法由计算机科学家Robert Tarjan提出,通过维护一个栈结构和时间戳(dfn)与追溯值(low)的概念,能够高效识别图中的环结构。算法核心在于:当某个节点的dfn等于low值时,说明该节点及其栈中后续节点构成一个强连通分量。文中详细介绍了算法的实现步骤、时间复杂度分析(O(n+m))以及应用场景,如图的缩点和解决2-SAT问题。此外还简要对比了Kosaraju和Garbow等其他SCC算法。
2025-08-22 22:44:57
1106
原创 无向图的连通性问题
本文介绍了无向图的连通分量、割点与桥、双连通分量等概念及其算法实现。主要内容包括: 连通分量:通过DFS或并查集算法求解无向图的连通分量,时间复杂度分别为O(n+m)和O(n+mα(n))。 割点与桥: 割点是删除后增加连通块数的节点,桥是删除后增加连通块数的边 使用Tarjan算法通过时间戳(dfn)和追溯值(low)在线性时间内识别 给出割点判定法则(dfn[x]≤low[y])和桥判定法则(dfn[x]<low[y]) 双连通分量: 边双连通分量(e-DCC):不含桥的极大子图,通过删除桥后DF
2025-07-27 23:15:50
1021
原创 欧拉图与欧拉回路
本文介绍了欧拉路问题的基本概念与求解方法。欧拉回路指通过图中每条边恰好一次的回路,欧拉通路则是通过每条边一次的通路。无向图中,欧拉图要求所有顶点度数为偶数且连通,半欧拉图要求恰有两个奇度顶点且连通。文章详细讲解了使用DFS和栈求解欧拉回路的算法流程,包括递归和非递归实现,并给出了C++代码模板。算法通过优化邻接表访问将复杂度降至O(N+M)。最后列出了相关练习题供读者实践。
2025-07-27 23:12:06
889
原创 背包问题及 LIS 优化
本文系统讲解了动态规划中背包问题的解法及其优化策略。首先介绍了记忆化搜索转递推的通用方法,重点分析了01背包、完全背包和多重背包三类经典问题。01背包通过状态转移方程f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+c[i])实现O(nW)时间复杂度的求解,并展示了空间优化技巧;完全背包通过调整转移方程实现相同复杂度;多重背包则提出二进制拆分优化将复杂度降至O(W∑logai)。文章还探讨了LIS问题的单调性优化解法,利用Dilworth定理将问题转化为O(nlogn)的二分查找问题
2025-07-26 23:28:03
1007
原创 树上倍增和LCA问题
摘要:最近公共祖先(LCA)是树形结构中的核心概念,广泛应用于路径查询、距离计算等场景。本文介绍了四种LCA求解方法:朴素算法(O(n)查询)、倍增法(O(nlogn)预处理,O(logn)查询)、欧拉序+RMQ(O(nlogn)预处理,O(1)查询)和Tarjan离线算法(O(nα(n)))。重点分析了倍增法和欧拉序+RMQ的实现原理,并讨论了LCA在子树查询、路径修改、虚拟树构建等问题中的应用,最后通过例题展示了LCA的实际应用场景。
2025-07-26 23:22:25
905
原创 拓扑排序(初中组)
定义边有向,无环。英文名叫 Directed Acyclic Graph,缩写是 DAG。一些实际问题中的二元关系都可使用 DAG 来建模。性质能 拓扑排序 的图,一定是有向无环图;如果有环,那么环上的任意两个节点在任意序列中都不满足条件了。有向无环图,一定能拓扑排序;(归纳法)假设节点数不超过 kk 的 有向无环图都能拓扑排序,那么对于节点数等于 kk 的,考虑执行拓扑排序第一步之后的情形即可。
2024-07-31 15:18:06
817
原创 进制和进制转换
进制的全称是进位计数制,是人为定义的带进位的计数方法,对于任何一种X进制,就表示每一位置上的数运算时都是逢 X进一位。十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,X进制就是逢X进位。
2023-07-26 12:39:32
16993
4
原创 7-6 广度优先和深度优先搜索的一些总结
注:搜索本质上就是枚举,只不过是一种有策略的枚举搜索算法是利用计算机的高性能来有目的的穷举一个问题解空间的部分或所有的可能情况,从而求出问题的解的一种方法。现阶段一般有枚举算法、深度优先搜索、广度优先搜索、A*算法、回溯算法、蒙特卡洛树搜索、散列函数等算法。搜索本质上就是枚举,只不过是一种有策略的枚举,通常在搜索前,根据条件降低搜索规模;根据问题的约束条件进行剪枝;利用搜索过程中的中间解,避免重复计算这几种方法进行优化。搜索算法实际上是根据初始条件和扩展规则。
2023-07-25 17:46:43
634
1
原创 6-8 二分查找
今天是端午节,祝大家端午节快乐~。言归正传┏ (゜ω゜)=☞二分查找也称折半查找,它是一种效率极高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列,就是:数据要是有序排列的。
2023-06-22 13:39:47
720
1
原创 深搜-剪枝优化
通过前面深搜的学习,相信同学们已经掌握了搜索的基本思路。但有些问题直接搜索会得到部分分,并不会得到满分,而且分析其时间复杂度也很高。这时候就需要优化,提高搜索效率。在之前的递归章节,已经介绍了一种优化方式——记忆化。本节重点学习剪枝的优化方式。
2023-06-16 22:41:35
1319
1
原创 Monge 矩阵(topscoding六一)这么卷?
我就做做玩玩结果!!!!!!!!!!!!!!!!!!!!!!!详见topscoding主页比赛小学组!
2023-06-01 22:00:01
450
8
空空如也
解密(topscoding)
2023-05-31
修正成绩(2121)
2023-05-27
A@B(topscoding)
2023-05-31
桐桐数(超时)不知怎么办(C++)
2023-05-14
找筷子(chopsticks.cpp)
2023-04-22
亲密数字(number)
2023-04-24
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅