数据结构
文章平均质量分 85
寂静山林
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
UVa 1455 Kingdom
本文研究古代王国城市连通性问题,动态维护道路修建后的连通分量,并支持查询水平线穿过的州数量及城市总数。关键结论是:一个州被水平线穿过当且仅当其最小y坐标小于C且最大y坐标大于C。采用并查集维护连通分量,同时记录每个分量的y坐标极值和城市数量。使用差分数组高效处理区间更新和查询,将y坐标乘以2转换为整数避免浮点误差。算法复杂度为O((n+m)α(n)+n log n),适用于大规模数据。实现时需注意严格不等式处理和内存优化。原创 2026-01-03 08:51:53 · 344 阅读 · 0 评论 -
UVa 10476 Spam or Not Spam
本文介绍了一种基于三字母组(trigram)和余弦相似度的垃圾邮件过滤方法。该方法通过统计邮件中三字母组频率,计算待分类邮件与垃圾邮件样本、非垃圾邮件样本的余弦相似度,根据相似度比较结果进行分类。输入包含多组测试数据,每组包含垃圾邮件样本、非垃圾邮件样本和待分类消息。输出每组测试编号及每条消息的分类结果,包括两个相似度值和最终判定(spam或non-spam)。实现时需注意不处理跨行三字母组、区分大小写及保留5位小数精度等细节。原创 2025-12-28 08:27:38 · 757 阅读 · 0 评论 -
UVa 566 Adam‘s Gene
本文提出了一种基因克隆关系追踪与突变计数问题的解决方案。该方案通过动态构建克隆家族树,检查克隆体与始祖ADAM的连接性(一致性)以及是否存在双突变基因(安全性)。核心算法采用哈希表存储基因计数,按输入顺序处理请求,并实时更新克隆体状态。对于每个请求,首先检查父克隆体是否存在且一致,然后继承父克隆体的基因计数并添加自身突变,最后按突变列表顺序检查首个双突变基因。时间复杂度为O(N×(G+M)),空间复杂度为O(N×G),适用于题目给定的约束条件。该方案能有效识别不一致和不安全的克隆请求,并按指定格式输出结果。原创 2025-12-26 09:08:44 · 679 阅读 · 0 评论 -
UVa 10030 Computer Dialogue
题目模拟三台计算机之间的逻辑推理过程。服务器从N个文件中选出一个,将文件名和扩展名分别发送给两个客户端。客户端通过交替发送“我不知道”消息来逐步排除可能性。给定消息交换次数M,需确定服务器可能选择的候选文件。算法通过模拟每次消息后的排除过程,逐步缩小候选文件集合,最终输出剩余文件。时间复杂度为O(N×M),适用于题目给定的数据范围。原创 2025-12-25 11:50:08 · 1018 阅读 · 0 评论 -
UVa 12674 Go up the Ultras
题目要求找出满足地形突出度≥150000厘米的山峰。关键步骤包括:使用单调栈确定左右第一个更高山峰的位置,通过稀疏表快速查询区间最小值来计算突出度。算法复杂度为O(N log N),适用于大规模数据。需注意严格更高、边界条件等细节。最终输出满足条件的山峰索引。原创 2025-12-24 11:35:30 · 1118 阅读 · 0 评论 -
UVa 10663 Non-Powerful Subsets
本文探讨了如何在一个自然数区间内寻找满足特定条件的子集问题。题目要求子集中不存在任何子集的和为幂数(形如N^M,N≥2,M≥2),且该子集是字典序最小的极大子集。通过预处理所有可能的幂数,并采用贪心策略按升序处理数字,在每一步检查加入数字后是否会破坏非幂性条件,最终构建出符合条件的子集。算法使用哈希集合存储子集和,确保高效查找和更新,时间复杂度为O((b-a+1)·|S|),适用于题目给定的范围限制。原创 2025-12-15 12:14:01 · 1015 阅读 · 0 评论 -
UVa 10552 Genealogical Research
本文实现了一个家谱管理系统,能够处理五种命令:BIRTH(记录出生信息)、DEATH(记录死亡日期)、ANCESTORS(查询祖先)、DESCENDANTS(查询后代)和QUIT(结束程序)。系统使用结构体存储人物信息,包括姓名、出生/死亡日期、父母及子女关系,并通过哈希表快速查找。关键点在于正确处理含空格和标点的姓名,按字母顺序排序亲属关系,以及递归遍历家族树时精确控制输出格式。算法时间复杂度为O(m log n),适用于小规模数据。原创 2025-12-14 15:55:34 · 794 阅读 · 0 评论 -
UVa 12232 Exclusive-OR
题目要求处理一组变量间的异或关系,支持两种事实输入(直接赋值或异或关系)和查询操作(求多个变量的异或和)。需要使用带权并查集维护变量间关系,处理冲突检测和查询回答。对于每个查询,根据连通分量分组计算异或和,若无法确定则输出未知。若事实冲突则立即终止处理。时间复杂度主要由并查集操作决定,适用于题目规模限制。原创 2025-12-14 14:49:19 · 777 阅读 · 0 评论 -
UVa 12424 Answering Queries on a Tree
本文研究了树上动态路径查询问题,支持单点颜色修改和路径颜色频率查询。针对颜色种类较少(1-10)的特点,提出了一种基于树链剖分和线段树的高效解法。算法通过维护10棵线段树(每棵对应一种颜色),利用树链剖分将路径拆分为O(logN)区间,在线段树上统计颜色出现次数。预处理时间复杂度O(N),单次修改O(logN),查询O(10log²N),在N,M≤10⁵时表现良好。实验验证了该方法在处理大规模数据时的有效性。原创 2025-12-06 17:09:00 · 946 阅读 · 0 评论 -
UVA 1525 Falling Leaves
题目要求根据给定的字母二叉搜索树叶子移除序列重构原始树,并输出其前序遍历结果。核心思路是逆向构造:从最后一轮移除的节点开始(即树的最深节点),按照BST规则依次插入每个字母,确保父节点先于子节点被插入。通过逆序处理输入数据并应用标准BST插入规则,可以唯一确定原始树结构,最后进行前序遍历输出。该算法时间复杂度为O(n²),适用于题目给定的数据规模。原创 2025-12-06 12:35:23 · 807 阅读 · 0 评论 -
UVa 12436 Rip Van Winkle‘s Code
题目要求高效处理对数组的三种区间更新操作(A、B、C)和一种查询操作(S)。直接模拟会导致超时,因此需要采用线段树数据结构,利用数学公式计算等差数列区间和,并通过懒标记技术实现高效的区间更新和查询。时间复杂度从O(T×N)优化到O(TlogN),适用于大规模数据。原创 2025-11-30 12:47:43 · 742 阅读 · 0 评论 -
UVa 13153 Number of Connected Components
本文提出了一种基于并查集和质因数分解的算法,用于计算节点标签GCD大于1时形成的图的连通分量数。通过预处理质数表,将每个节点与其质因子合并,利用并查集维护连通性。算法高效处理了直接建图不可行的问题,时间复杂度为O(NlogM),适用于大规模数据。特殊处理标签1的节点,最终连通分量数为非1节点的连通分量数与1的节点数量之和。该方法通过间接建图的思想,有效解决了图论中的连通性问题。原创 2025-11-25 16:47:17 · 686 阅读 · 0 评论 -
UVa 10352 Count the eWords
本文分析了Malfunction Checkers Ltd公司因编译器病毒导致的字符串比较异常问题。题目要求统计电子邮件中单词出现次数,但需要考虑strcmp()函数会忽略第3个字符且只比较前5个字符的特殊行为。通过将问题转化为字符串分组统计,提出使用map<string, vector<string>>数据结构来分组存储单词,其中键为忽略第3个字符后的前5字符。算法实现中利用map的自动排序特性,通过控制单词加入顺序确保输出每组字典序最大的单词。该方法时间复杂度为O(N lo原创 2025-11-23 14:47:32 · 560 阅读 · 0 评论 -
UVa 1665 Islands
本文探讨了解决网格岛屿连通区域问题的算法。关键思路是采用逆序处理方式,将海平面上升转化为下降过程,配合并查集高效维护连通性。算法步骤包括:预处理格子和查询数据,按高度降序处理,使用并查集动态维护区域数,最后按原始查询顺序输出结果。该方法有效解决了正向处理中区域分裂的难题,时间复杂度为O(nmα(nm)+TlogT)。逆向思维在处理单调变化问题上展现了显著优势。原创 2025-11-23 11:34:31 · 412 阅读 · 0 评论 -
UVa 1598 Exchange
本文实现了一个订单簿系统,用于处理东北资源交易所的买卖订单。系统支持三种操作:买入(BUY)、卖出(SELL)和取消(CANCEL)。订单匹配遵循价格优先和时间优先原则,当买入价≥卖出价时自动成交。系统维护两个优先队列(买入订单按价格降序,卖出订单按价格升序),并在每次操作后输出交易记录和当前报价(最高买价/最低卖价及其数量)。算法复杂度为O(n^2),适用于n≤10000的场景。代码使用C++实现,通过map和vector高效管理订单状态。原创 2025-11-22 18:23:51 · 1013 阅读 · 0 评论 -
UVa 12365 Jupiter Attacks
题目描述木星入侵地球,需要处理两种操作:修改固件字节值和计算区间哈希值。哈希函数H(f_i...f_j)定义为多项式哈希模质数P。使用线段树高效支持单点更新和区间查询,预处理B的幂次模P,线段树节点存储哈希值和区间长度,合并左右子节点计算总哈希。算法复杂度O(N log L),适合1≤L,N≤1e5的规模。代码实现包括线段树构建、更新和查询,以及预处理幂次表。原创 2025-11-21 08:10:54 · 565 阅读 · 0 评论 -
UVa 1479 Graph and Queries
这篇摘要概述了一个动态图连通性维护与查询问题的解决方案,核心思路是采用离线处理和时间倒流技术将删除边操作转化为添加边操作。文章首先分析了问题的难点,然后详细阐述了将操作序列倒序处理并利用并查集维护连通块的方法,其中每个连通块使用有序数组存储顶点权值以支持快速合并和查询。算法分析表明该方法在实际数据中表现良好,能够满足题目要求。最后提供了完整的C++代码实现,并总结了逆向思维在解决此类问题中的重要性。原创 2025-11-21 08:10:37 · 928 阅读 · 0 评论 -
UVa 1556 Disk Tree
本文解决了一个目录树重建问题,要求根据给定的路径列表构建并格式化输出目录树结构。问题核心在于如何将扁平的路径信息转换为层次化的树形表示。作者采用字典树数据结构来高效处理目录间的父子关系,通过路径解析、树形构建和递归遍历三个主要步骤实现功能。算法的时间复杂度为O(N×L×logM),空间复杂度为O(N×L),其中N为路径数量,L为路径平均长度,M为节点平均子节点数。最终的C++实现展示了如何通过字典树结构优雅地解决层次数据组织问题,实现了按字典序排序和格式化缩进输出的要求,体现了树形结构在数据处理中的优原创 2025-11-09 08:38:16 · 523 阅读 · 0 评论 -
UVa 10234 Frequent Substrings
本文讨论如何统计字符串中出现频率最高的指定长度子串(N-Gram)。核心思路包括将字符串统一转为小写、枚举所有可能子串并用map统计频率,最后选择出现次数最多且字典序最小的子串。算法复杂度为O(L·N logL),适用于长度不超过1000的字符串。实现时需注意处理输入输出细节,如换行符和大小写转换。该问题考察了字符串处理、频率统计和字典序比较的综合能力。原创 2025-11-08 09:02:32 · 1002 阅读 · 0 评论 -
UVa 822 Queue and A
本文提出了一种贪心预处理算法解决技术支持请求调度问题。算法首先预处理所有请求并按时序排序,然后通过贪心策略为每个请求分配最早可用的员工。实现上避免了复杂的事件驱动模拟,采用简洁的预处理和动态排序机制。该方案时间复杂度为O(R×M×T×logM),在题目约束下高效稳定。代码清晰展示了请求生成、员工排序、请求分配等关键步骤,最终计算所有请求完成的最长时间。相比事件模拟法,本方法实现简单、性能优越,适用于类似调度场景。原创 2025-11-08 08:59:58 · 428 阅读 · 0 评论 -
UVa 11386 Triples
本文探讨了如何高效计算满足x+y=z的三元组(x,y,z)的数量问题。针对给定的正整数序列,分析了暴力枚举法O(N³)的时间复杂度缺陷,提出利用哈希表统计频率和去重排序的优化思路。关键点在于:1) 统计数字频率;2) 枚举不同数值对而非下标;3) 根据x和y的关系分类计算贡献值。实现了O(M²)的优化算法(M为不同数字数量),并通过样例验证了正确性。提供的C++代码展示了具体实现,包括输入加速、频率统计、去重枚举和结果计算等步骤。该优化方法有效解决了组合计数问题,尤其适用于包含重复元素的场景。原创 2025-11-04 14:23:52 · 574 阅读 · 0 评论 -
UVa 10024 Curling up the Cube
种不同的基本形状,这是数学上已经证明的结论。将每种变体标准化(平移到左上角),然后与预定义的。网格图案是否能够折成一个立方体。是否形成一个连通区域。本题要求判断一个给定的。立方体的展开图有且只有。原创 2025-11-03 16:50:14 · 270 阅读 · 0 评论 -
UVa 1597 Searching the Web
本文实现了一个基于倒排索引的小型搜索引擎,支持布尔查询。系统从文档集合中构建索引,处理四种查询:单个词、AND(交集)、OR(并集)和NOT(排除)。文档以分隔符标记,查询结果按格式输出匹配行或完整文档。核心包括:1)文档预处理和倒排索引构建;2)停用词过滤;3)查询解析与结果合并;4)格式化输出处理。采用哈希表存储索引,集合去重优化性能,满足大规模查询需求,无结果时输出提示信息。该实现完整覆盖了题目要求的查询类型和输出格式。原创 2025-11-02 21:09:25 · 409 阅读 · 0 评论 -
UVa 11058 Encoding
本文研究字符串编码替换问题,提出了一种高效的处理方法。针对输入字符串S,需根据位置相关的编码规则动态替换字符。初始有26个字母的默认映射,随后R条规则按位置非递减给出,同一位置同一字母的规则以后出现的为准。算法采用顺序处理策略:初始化编码表后,用双指针遍历字符串和规则,实时更新编码映射并生成结果。该方法时间复杂度为O(|S|+R),通过规则指针优化避免重复处理。实验证明该方案能正确处理动态变化的编码规则,满足题目要求。原创 2025-10-30 12:22:16 · 445 阅读 · 0 评论 -
UVa 12174 Shuffle
本文探讨了音乐播放器随机播放模式下如何预测下一次洗牌的可能时间点。给定歌曲数量s和历史播放记录n,需找出所有可能的洗牌位置。通过预处理技术(滑动窗口检测排列、前缀/后缀无重复标记)和枚举起始偏移量k,高效验证分割区间的合法性。最终统计不同的剩余歌曲数,输出可能位置数量。算法复杂度为线性,适用于大规模数据。原创 2025-10-28 13:33:47 · 978 阅读 · 0 评论 -
UVa 13094 Tobby Bones
本文提出了一种基于分块算法的高效解决方案,用于处理Tobby狗狗的骨头收集与查询问题。通过将槽位分为√N大小的块,并在每个块内维护排序数组,实现了O(√N log√N)的更新操作和O(√N)的查询操作。该算法在N≤6×10⁵、M≤2×10⁶的大数据量下表现出色,平衡了更新与查询效率,有效解决了区间内尺寸受限元素的统计问题。原创 2025-10-25 12:19:56 · 648 阅读 · 0 评论 -
UVa 10273 Eat or not to Eat?
题目描述农夫John每天吃掉产奶量最少的奶牛,若最少产奶量有多头牛则当天不吃。每头牛的产奶量按给定周期循环变化。要求计算最终未被吃掉的牛数量和最后一头牛被吃的天数。 解题思路采用模拟方法,逐天处理:初始化存活状态;每天计算存活牛的产奶量,找出最小值;若唯一则吃掉,否则跳过;设置终止条件防止无限循环。关键点包括周期处理、防无限循环判断(2520天未吃终止)和效率优化。 代码实现读取输入后,模拟每天过程,统计存活牛数和最后被吃天数。算法时间复杂度O(D×N),空间复杂度O(N×maxTi),在题目限制下高效可行原创 2025-10-25 10:03:59 · 611 阅读 · 0 评论 -
UVa 806 Spatial Structures
题目大意:本题是关于四叉树在黑白图像表示中的应用,要求实现矩阵与路径编号之间的双向转换。输入为正数n时表示n×n的0/1矩阵,需转换为黑块路径编号列表;输入为负数时表示路径编号列表,需转换为字符图像。四叉树通过递归划分区域,黑叶子节点路径用五进制编码转为十进制输出。解题思路采用递归分治处理矩阵划分,并按方向编码转换路径。对于路径转图像,则根据编号反推区域并填充。输出格式要求每12个编号换行,图像用'.'和'*'表示。原创 2025-10-23 15:20:35 · 580 阅读 · 0 评论 -
UVa 1619 Feel Good
给定一个非负整数数组,定义区间价值为区间和乘以区间最小值。要求找到价值最大的区间。通过固定最小值,利用单调栈高效求出每个元素作为最小值时的最大区间范围,从而将时间复杂度优化到O(n)。具体步骤包括计算前缀和数组、用单调栈求左右边界、遍历计算每个位置的价值并更新最大值。该算法巧妙利用单调栈特性,避免了O(n^2)的暴力枚举,适用于大规模数据。原创 2025-10-23 10:53:00 · 574 阅读 · 0 评论 -
UVa 11020 Efficient Solutions
题目描述了一个公主维护有效求婚者列表的问题,每位绅士由家世和魅力两个分数表示(分数越低越好)。绅士B支配A的条件是B在至少一个维度严格优于A且另一个维度不差。需要动态维护当前未被任何已见绅士支配的集合,并在每次更新后输出其大小。 关键算法使用multiset存储有效点,按家世升序排序。处理新点时:1)检查是否被已有集合中的点支配;2)若未被支配则插入新点并删除所有被新点支配的点。该算法的时间复杂度为O(n log n),适用于n≤15000的规模。实现中需注意重复点和高效删除被支配点的处理。原创 2025-10-21 21:19:46 · 913 阅读 · 0 评论 -
UVa 10587 Mayor‘s Posters
解题采用逆向处理思路,从最后一张海报开始检查,并使用离散化和线段树优化。关键步骤包括:1)收集所有端点进行离散化;2)建立坐标映射;3)从后往前处理海报,通过线段树判断当前海报是否有未被覆盖的部分;4)若有则计数,并标记该区间为已覆盖。该方法有效处理了大规模数据,确保在合理时间内完成计算。最终输出仍可见的海报数量。原创 2025-10-21 20:14:47 · 834 阅读 · 0 评论 -
UVa 12345 Dynamic len(set(a[L:R]))
本文介绍了一种解决动态区间不同数统计问题的带修莫队算法。该算法将时间维度引入传统的莫队算法,通过分块处理(块大小为n^(2/3))和对查询的三维排序(左端点块、右端点块、时间戳),将复杂度优化至O(n^(5/3))。关键操作包括add/del函数维护当前区间统计,以及调整指针时保持数据一致性。算法支持单点修改和区间查询,适用于n,m≤50000的规模,通过奇偶排序进一步优化性能,是一种高效的离线处理方案。原创 2025-10-18 05:26:36 · 438 阅读 · 0 评论 -
UVa 1736 Balanced Diet
这篇题解分析了如何判断在保持糖果饮食平衡的前提下最多能吃多少颗糖果。核心思路是:将平衡条件转化为每种糖果的下次不能吃的最小数量n,使用优先队列模拟吃糖过程。当n超过该糖果的阈值或能被总比例整除时终止,判断是否可以无限吃或输出剩余可吃数量。算法复杂度与糖果种类和总比例相关。原创 2025-10-17 08:10:42 · 997 阅读 · 0 评论 -
UVa 252 Trucking
本题是一个物流调度模拟问题,要求模拟卡车货运公司的集装箱处理网络。系统包含多个中间处理中心(ICPC),每个中心设卸货门和转运门,需要处理拖车到达、卸货、转运等操作,并计算平均等待时间和识别延迟货物。核心算法采用事件驱动模拟,使用优先队列处理事件。关键点在于正确实现优先级调度规则(转运优先、运输时间长的优先)和货物转运逻辑(拖车装满或当天所有货物到达时发车),同时需准确计算等待时间和识别延迟货物。系统复杂度为O(E log E + N×D),其中E是事件数,N为中心数,D为门数。原创 2025-10-10 16:11:29 · 251 阅读 · 0 评论 -
UVa 1402 Robotic Sort
摘要: 本文介绍了利用伸展树(Splay Tree)解决机器人排序问题的算法设计。问题要求机械臂通过反转连续样本区间来排序不同高度的材料样本。算法核心在于Splay Tree的高效区间反转和最小值查询功能,通过节点结构维护子树最小值和反转标记,实现O(n log n)的时间复杂度。代码实现详细展示了树的构建、旋转、标记传递等关键操作,确保在保持样本相对顺序的前提下完成排序。原创 2025-10-08 08:47:24 · 142 阅读 · 0 评论 -
UVa 11996 Jewel Magic
摘要:本文探讨了珠宝字符串的动态操作问题,涉及0(翡翠)和1(珍珠)组成的字符串。支持四种操作:插入、删除、反转子串和查询最长公共前缀(LCP)。采用Splay Tree结合字符串哈希的算法,通过维护正向/反向哈希值高效处理反转操作,利用二分查找实现LCP查询。时间复杂度为O(log n)(基本操作)和O(log² n)(查询),空间复杂度O(n+m)。代码实现包含Splay节点结构、哈希计算、旋转操作及内存管理等关键部分,有效解决了动态字符串处理问题。原创 2025-10-08 08:35:25 · 295 阅读 · 0 评论 -
UVa 11994 Happy Painting!
本文提出了一种基于Link-Cut Tree的动态森林操作算法,用于处理三种操作:修改父节点、路径染色和路径查询。算法通过维护节点颜色位掩码和子树信息,实现了高效的动态连接、断开和路径操作。每个LCT操作的时间复杂度为O(log n),空间复杂度为O(n)。代码实现详细展示了节点表示、核心操作和复杂度分析,能够高效处理包含n个节点的彩色有根森林的各类动态操作。原创 2025-10-08 08:29:28 · 653 阅读 · 0 评论 -
UVa 1592 Database
摘要:本文探讨如何高效检测一个n行m列的表格中是否存在两行在任意两列上的值对应相同。由于m较小,通过枚举每行中两列值的配对,并利用哈希表记录配对出现的行号,可以在O(n*m^2)时间复杂度内解决问题。当发现某个配对重复出现时,即可确定存在满足条件的行和列。该方法避免了暴力枚举带来的高复杂度,适用于大规模数据。原创 2024-11-14 18:36:14 · 757 阅读 · 0 评论 -
第2章 数据结构:2.11.1 线段树
原创 2020-06-03 17:21:19 · 367 阅读 · 0 评论 -
11990 Dynamic Inversion(动态逆序对)
摘要:本文研究排列逆序对数的动态维护问题。给定一个1到n的排列,在每次删除元素前输出当前逆序对数。通过将元素视为二维平面上的点,利用分块技术统计矩形区域内的点数,从而高效计算删除元素对逆序对数的影响。算法时间复杂度为O(√n)每次操作,适用于大规模数据(n≤200,000)。代码实现采用二维分块结构,维护前缀和以快速查询区域点数,并通过坐标变换计算逆序对变化量。原创 2020-05-25 16:23:24 · 666 阅读 · 0 评论
分享