发布时间:2026/6/18 12:32:58
信息学奥赛刷题实战:OpenJudge NOI 1.11 08题,手把手教你用C++ STL的set容器去重排序
信息学奥赛刷题实战用C STL的set容器优雅解决去重排序问题在信息学奥赛的备战过程中我们经常会遇到需要处理大量数据并去重排序的场景。传统的手写排序和查找算法虽然能解决问题但往往需要编写大量代码容易出错且效率不高。本文将带你探索C标准模板库(STL)中set容器的强大功能它能让你用更简洁、更优雅的方式解决这类问题。1. 为什么选择STL容器而非手写算法很多初学者在解决不重复输出这类问题时第一反应是手写排序和查找算法。这种思路固然正确但在竞赛环境下我们需要考虑更多因素开发效率手写二分查找和插入排序需要约50行代码而使用set容器只需不到20行维护成本手写算法更容易出现边界条件错误调试耗时执行效率set容器底层通常采用红黑树实现保证O(log n)的查找和插入复杂度代码可读性使用标准库能让代码意图更清晰便于他人理解// 传统手写算法示例部分代码 bool isFound(int x) { int l 1, r an, m; while(l r) { m (l r) / 2; if(x a[m]) r m - 1; else if(x a[m]) l m 1; else return true; } return false; }相比之下set容器的使用简直是一种享受// 使用set容器的等效功能 setint unique_numbers; unique_numbers.insert(x); // 自动去重和排序2. set容器核心特性与底层原理set是C STL中的关联式容器它为我们提供了开箱即用的去重和排序功能。理解其工作原理能帮助我们在不同场景下做出更明智的选择。2.1 set的核心特性自动去重相同的元素不会被重复存储自动排序元素默认按升序排列快速查找基于红黑树实现查找复杂度O(log n)动态大小不需要预先指定容量2.2 底层数据结构红黑树set通常基于红黑树一种自平衡二叉查找树实现这保证了即使在最坏情况下插入、删除和查找操作的时间复杂度都是O(log n)。红黑树通过以下规则保持平衡每个节点非红即黑根节点是黑色红色节点的子节点必须是黑色从任一节点到其每个叶子的所有路径包含相同数目的黑色节点提示虽然不需要手动实现红黑树但了解这些特性有助于理解set的性能特点。3. 实战用set解决OpenJudge NOI 1.11 08题让我们回到OpenJudge NOI 1.11 08题的具体问题输入n个数要求不重复地按升序输出这些数。以下是使用set容器的完整解决方案#include iostream #include set using namespace std; int main() { int n, x; cin n; setint unique_numbers; for(int i 0; i n; i) { cin x; unique_numbers.insert(x); } for(int num : unique_numbers) { cout num ; } return 0; }这个解决方案的优雅之处在于去重set自动处理重复值排序元素自动按升序排列简洁核心逻辑仅需3行代码高效整体时间复杂度O(n log n)3.1 性能对比让我们比较不同方法在处理10^5个随机整数时的表现方法代码行数时间复杂度内存使用实现难度手写插入排序二分查找~50O(n²)低高手写快速排序遍历去重~40O(n log n)低中STL sort遍历去重~20O(n log n)低低STL set~15O(n log n)中极低从表中可以看出set在实现难度和代码简洁性上有明显优势虽然内存使用略高但在大多数竞赛场景中是可接受的。4. 进阶技巧与最佳实践掌握了set的基本用法后让我们深入探讨一些能让你在竞赛中更高效使用set的技巧。4.1 自定义排序规则有时我们需要降序排列或按特定规则排序。set允许我们通过自定义比较函数来实现struct Descending { bool operator()(int a, int b) const { return a b; } }; setint, Descending descending_set;4.2 高效查找操作set提供了多种查找方法合理使用可以提升代码效率setint s {1, 3, 5, 7, 9}; // 检查元素是否存在 if(s.count(5)) { // 存在 } // 查找元素返回迭代器 auto it s.find(5); if(it ! s.end()) { // 找到元素 } // 查找第一个不小于给定值的元素 auto lower s.lower_bound(4); // 返回指向5的迭代器4.3 与其他容器的配合使用在实际问题中我们经常需要将set与其他容器配合使用vectorint input {3, 1, 4, 1, 5, 9, 2, 6, 5}; setint unique_sorted(input.begin(), input.end()); // 将结果转存到vector vectorint output(unique_sorted.begin(), unique_sorted.end());4.4 内存优化unordered_set的选择当只需要去重而不需要排序时可以考虑使用unordered_set它基于哈希表实现插入和查找的平均时间复杂度为O(1)#include unordered_set unordered_setint unique_numbers;但要注意unordered_set不保证元素顺序且在最坏情况下时间复杂度会退化到O(n)。5. 常见问题与调试技巧即使是经验丰富的选手在使用set时也可能遇到一些问题。以下是几个常见场景及其解决方案。5.1 迭代器失效问题在遍历set时修改容器会导致未定义行为setint s {1, 2, 3, 4, 5}; // 错误示范在遍历时删除元素 for(auto it s.begin(); it ! s.end(); it) { if(*it % 2 0) { s.erase(it); // 危险迭代器失效 } } // 正确做法 for(auto it s.begin(); it ! s.end(); ) { if(*it % 2 0) { it s.erase(it); // erase返回下一个有效迭代器 } else { it; } }5.2 自定义类型的set使用如果要存储自定义类型需要提供比较函数struct Point { int x, y; }; struct PointCompare { bool operator()(const Point a, const Point b) const { return a.x b.x || (a.x b.x a.y b.y); } }; setPoint, PointCompare point_set;5.3 性能调优当处理超大规模数据时可以考虑以下优化预先调用reserve()对于unordered_set使用emplace()而非insert()避免临时对象构造考虑内存局部性有时vectorsortunique可能更快vectorint v {3, 1, 4, 1, 5, 9, 2, 6, 5}; sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end());在实际比赛中我通常会准备两种解决方案的模板根据题目数据规模选择最合适的实现方式。对于大多数中等规模数据(10^4-10^5)set是最省心的选择而对于超大规模数据(10^6)可能需要考虑更优化的方案。

相关新闻

别再复制粘贴了!手把手教你用腾讯云CentOS7.5部署Spring Boot项目(含MySQL8.0避坑指南)
2026/6/18 12:32:10

别再复制粘贴了!手把手教你用腾讯云CentOS7.5部署Spring Boot项目(含MySQL8.0避坑指南)

腾讯云CentOS 7.5实战:Spring Boot项目部署与MySQL 8.0深度调优指南 开篇:为什么你的Spring Boot项目总在部署时崩溃? 每次看到"部署成功"的截图就跃跃欲试,结果自己操作时却卡在莫名其妙的错误上?这可能是…

阅读更多
遗传算法实战:Python手写N皇后求解器(含100皇后完整实现)
2026/6/16 18:51:59

遗传算法实战:Python手写N皇后求解器(含100皇后完整实现)

1. 这不是教科书,而是一次真实的GA项目复盘:从Matlab到Python的N皇后实战手记你点开这篇文章,大概率不是为了背诵“遗传算法是模拟生物进化过程的优化方法”这种定义。你真正想搞清楚的是:当一个真实项目摆在面前——比如用遗传算…

阅读更多
LPC122x Cortex-M0微控制器:工业级嵌入式开发实战解析
2026/6/16 4:52:15

LPC122x Cortex-M0微控制器:工业级嵌入式开发实战解析

1. 项目概述:为什么选择LPC122x系列? 在嵌入式开发领域,选型往往是项目成败的第一步。面对市面上琳琅满目的ARM Cortex-M0微控制器,NXP的LPC122x系列总能引起我的注意。这不仅仅是因为它来自一家老牌的半导体厂商,更是…

阅读更多
K2.5开源Agent集群:系统智能时代的任务编排范式
2026/6/18 11:58:45

K2.5开源Agent集群:系统智能时代的任务编排范式

1. 项目概述:这不是一次普通模型更新,而是一次Agent协作范式的公开验证 Kimi团队最近发布的K2.5模型,表面看是“又一个大模型迭代”,但实际拆开来看,它根本不是传统意义上单体推理能力的线性增强。我从去年开始深度跟踪…

阅读更多
解锁时序数据分析新思路:Timer时序大模型TimechoAI实操与技术能力详解
2026/6/18 11:58:45

解锁时序数据分析新思路:Timer时序大模型TimechoAI实操与技术能力详解

在工业物联网、电力、轨道交通、气象、量化金融场景中,各类传感器、采集设备持续产生海量连续时序数据。大量企业通过TimechoDB(https://timecho.com)完成海量测点数据持久化存储,但普遍存在数据利用难的问题:传统统计…

阅读更多
WarcraftHelper:解决魔兽争霸3五大经典问题的终极方案
2026/6/18 11:58:45

WarcraftHelper:解决魔兽争霸3五大经典问题的终极方案

WarcraftHelper:解决魔兽争霸3五大经典问题的终极方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典魔兽争霸3在现代系统上的…

阅读更多
小白程序员转型大模型开发:一份从入门到精通的详细攻略(收藏必备)
2026/6/18 11:58:45

小白程序员转型大模型开发:一份从入门到精通的详细攻略(收藏必备)

本文为想要进入大模型领域的程序员提供了一份详尽的转型攻略。首先明确大模型开发、应用、研究和工程等不同方向,随后深入讲解Python编程、深度学习框架、数学基础和机器学习等必备知识。接着,详细介绍了Transformer架构、预训练与微调、大模型优化技术以…

阅读更多
七层 Bot 流量深度甄别:区分真实访客与模拟低频 CC 攻击
2026/6/18 11:58:45

七层 Bot 流量深度甄别:区分真实访客与模拟低频 CC 攻击

七层 Bot 流量深度甄别方法行为特征分析通过分析访问行为的时序特征、点击轨迹和交互模式,识别异常行为。真实用户的行为通常具有随机性和连续性,而模拟流量可能呈现固定间隔或重复性操作。请求头检测检查 HTTP 请求头中的 User-Agent、Accept-Language、…

阅读更多
开源AI安全工具实战:NeMo Guardrails、PyRIT与灰区治理
2026/6/18 10:58:45

开源AI安全工具实战:NeMo Guardrails、PyRIT与灰区治理

1. 项目概述:当AI安全撞上现实预算,开源工具就是你的生存补给包你有没有过这种时刻:凌晨两点,咖啡因和肾上腺素在血管里打架,盯着屏幕上那个刚上线、还没来得及加防护的LLM聊天机器人,心里默念“别出事、别…

阅读更多
别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)
2026/6/17 23:21:18

别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)

超越BERT:用Transformers库高效实现文本相似度计算的三种实战方案在自然语言处理领域,文本相似度计算是信息检索、问答系统和推荐系统等应用的核心技术。传统方法如TF-IDF或Word2Vec已逐渐被基于Transformer的预训练模型所取代。Hugging Face的Transform…

阅读更多
Prompt Engineering:重构人机协作的工程化方法论
2026/6/18 4:35:02

Prompt Engineering:重构人机协作的工程化方法论

1. 项目概述:这不是“写提示词”,而是重构人机协作的底层逻辑“Prompt Engineering”这个词,这两年被讲得太多,也太轻飘。很多人把它理解成“给AI发指令的技巧”,甚至简化为“多加几个形容词”“换种说法再试一次”。我…

阅读更多
Anthropic提示层归零:模型即协议的工程实践
2026/6/17 10:35:40

Anthropic提示层归零:模型即协议的工程实践

1. 项目概述:这不是一次普通更新,而是一次架构级“蒸发”“Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题一出来,我正在调试一个Claude调用链的终端前停了三秒。不是因为震惊,而是因为熟悉&…

阅读更多
零碳供电所照明控制系统技术解析:标准要求与产品落地
2026/6/18 0:58:44

零碳供电所照明控制系统技术解析:标准要求与产品落地

一、零碳供电所对照明控制系统的硬性要求 《零碳供电所创建与评价规范》(T/ZDL 02-2022)是全国首个零碳供电所评价的团体标准,于2022年10月1日起实施-10-2。该标准将建筑、交通、办公、能源、建设与管理等多个维度零碳评价指标融为一体&#…

阅读更多
学生党AI学习指南:GPT、Gemini、WPS AI三工具协同实战
2026/6/18 0:58:44

学生党AI学习指南:GPT、Gemini、WPS AI三工具协同实战

1. 这不是工具清单,是学生党用时间砸出来的“AI生存指南”最近在图书馆自习区,我常看见对面座位的同学盯着屏幕发呆——不是在刷短视频,而是在和某个AI对话框反复拉扯:输入问题、删掉重写、再改提示词、等结果、皱眉、刷新……半小…

阅读更多
Gemini 3.1 Pro+DeepSider:新人零门槛AI工作流实战指南
2026/6/18 0:58:44

Gemini 3.1 Pro+DeepSider:新人零门槛AI工作流实战指南

1. 为什么Gemini 3.1 Pro值得新人认真对待——不是又一个“聊天玩具”最近在几个技术社群和内容创作小组里,总能看到有人发截图:“Gemini 3.1 Pro刚跑完一份20页PDF的逻辑图谱,还顺手把矛盾点标红了”;也有人贴出对比:…

阅读更多
GIT修改用户名
2026/6/17 19:45:33

GIT修改用户名

在GIT中修改用户名可按以下步骤操作: 查看当前git的用户名,使用命令git config --list或git config user.name。修改git用户名,使用命令git config --global user.name "xxx(新的用户名)",将其中…

阅读更多
Win11Debloat:让你的Windows系统重获新生的终极优化工具
2026/6/16 16:55:24

Win11Debloat:让你的Windows系统重获新生的终极优化工具

Win11Debloat:让你的Windows系统重获新生的终极优化工具 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …

阅读更多
技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践
2026/6/17 4:21:30

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter m4s-converter是一个…

阅读更多