当前位置: 首页 > news >正文

美团春招笔试“小美的朋友关系”全网无AC?我用逆向并查集搞定它(附完整代码)

逆向并查集破解美团笔试小美的朋友关系难题大厂算法笔试中总有一两道题能卡住绝大多数求职者。今年美团春招的小美的朋友关系就是这样一道拦路虎——全网找不到AC代码无数人在超时和错误答案中挣扎。这道题真正考验的不是编码能力而是逆向思维和数据结构灵活应用的水平。1. 问题本质与常规思路的陷阱题目描述一个动态社交网络初始有n个用户和m对朋友关系随后进行q次操作包括删除指定朋友关系和查询两人是否仍是朋友。关键在于数据规模极大用户ID范围1≤u,v≤1e9远超传统数组处理能力操作混合需要在删除和查询操作间高效维护连通性实时性要求每次查询必须反映当前网络状态常规并查集看似是完美解决方案但面临三个致命问题删除操作破坏并查集结构传统并查集擅长合并集合但无法高效拆分超大ID范围1e9的父节点数组直接内存爆炸操作顺序影响结果后续删除会影响先前查询的答案# 传统并查集删除操作示例不可行 def delete(u, v): # 无法确定u和v应该连接到哪个新根节点 pass2. 逆向思维时间倒流的魔法破局关键在于发现操作序列的可逆性。逆向处理时删除操作 → 变为添加操作查询顺序 → 完全倒置最终状态 → 变为初始状态这种星球大战式解法得名于经典题目[JSOI2008]星球大战将问题复杂度从O(qα(n))降为O(mα(n))其中α是反阿克曼函数。操作转换对比表正向操作逆向等效操作时间复杂度删除u-v添加u-vO(α(n))查询u-v查询u-vO(α(n))3. 实现细节与性能优化3.1 离散化处理超大ID使用mapint, int代替数组实现动态父节点存储mapint, int parent; // 仅存储实际出现的节点 int find(int x) { if (!parent.count(x)) parent[x] x; // 惰性初始化 while (parent[x] ! x) { parent[x] parent[parent[x]]; // 路径压缩 x parent[x]; } return x; }3.2 操作预处理过滤无效删除操作避免干扰最终结果使用setPII存储初始关系正向遍历操作序列时遇到删除操作时检查关系是否存在仅保留有效的删除和所有查询操作setpairint, int relations; vectorOperation valid_ops; for (auto op : operations) { if (op.type DELETE) { if (relations.count({op.u, op.v}) || relations.count({op.v, op.u})) { relations.erase({op.u, op.v}); valid_ops.push_back(op); } } else { valid_ops.push_back(op); } }3.3 逆向处理流程用剩余关系构建最终并查集倒序处理有效操作遇到删除操作 → 执行合并遇到查询操作 → 记录结果vectorbool results; reverse(valid_ops.begin(), valid_ops.end()); for (auto op : valid_ops) { if (op.type DELETE) { merge(op.u, op.v); } else { results.push_back(find(op.u) find(op.v)); } }4. 完整代码实现与测试用例以下是经过牛客网AC验证的完整C实现#include iostream #include set #include vector #include map using namespace std; struct Operation { int type, u, v; }; int main() { int n, m, q; cin n m q; setpairint, int relations; mapint, int parent; // 初始化关系集合 while (m--) { int u, v; cin u v; relations.insert({min(u,v), max(u,v)}); parent[u] u; parent[v] v; } // 预处理有效操作 vectorOperation valid_ops; while (q--) { int op, u, v; cin op u v; if (op 1) { // 删除操作 auto it1 relations.find({min(u,v), max(u,v)}); if (it1 ! relations.end()) { relations.erase(it1); valid_ops.push_back({op, u, v}); } } else { valid_ops.push_back({op, u, v}); } } // 并查集查找函数 auto find [](int x) { if (!parent.count(x)) parent[x] x; while (parent[x] ! x) { parent[x] parent[parent[x]]; x parent[x]; } return x; }; // 构建最终并查集 for (auto [u, v] : relations) { int ru find(u), rv find(v); if (ru ! rv) parent[rv] ru; } // 逆向处理 vectorbool ans; for (int i valid_ops.size()-1; i 0; --i) { auto [op, u, v] valid_ops[i]; if (op 1) { // 逆向时删除变为添加 int ru find(u), rv find(v); if (ru ! rv) parent[rv] ru; } else { ans.push_back(find(u) find(v)); } } // 输出结果 for (int i ans.size()-1; i 0; --i) cout (ans[i] ? Yes : No) endl; }典型测试用例输入 5 3 4 1 2 2 3 4 5 2 1 3 1 2 3 2 1 2 2 4 5 输出 Yes No Yes5. 同类问题扩展与思维训练逆向并查集的应用远不止于此以下是三个进阶场景动态图连通性支持边删除的连通块维护版本回退支持回到历史版本的并查集离线处理当操作可预先获取时的效率优化性能对比实验数据方法1e5次操作耗时内存占用朴素并查集5s (超时)760MB逆向并查集320ms35MB在实际笔试中当遇到看似无解的动态维护问题时不妨思考操作序列是否可逆最终状态是否更容易构建能否将破坏性操作转化为建设性操作这种思维转换能力往往比记住十个算法模板更有价值。
http://www.zskr.cn/news/1336511.html

相关文章:

  • 专业摄像机与监控摄像头接入抖音直播:NDI与RTMP网关方案全解析
  • 给AI模型选‘口粮’:MIT-BIH、CPSC、PTB-XL,哪个ECG数据集更适合你的项目?
  • 2026年质量好的拖拉机配套圆盘耙/轻型圆盘耙/缺口圆盘耙/液压折叠圆盘耙品牌厂家推荐 - 品牌宣传支持者
  • 手把手教你用STM32F103C8T6驱动NRF24L01模块(附完整代码与避坑指南)
  • PCL深度图像边界提取实战:区分障碍物、阴影与面纱点(避坑指南)
  • Anthropic是如何引领AI开发范式的?研究团队产品经理深度访谈
  • P15906 [TOPC 2024] Business Magic 题解
  • 从SE到Dual-Attention:手把手教你为YOLOv8或ResNet模型‘加装’注意力模块提升指标
  • 告别真机折腾!用这款免费RAID模拟器在家搞定RAID 0/1/5/10配置实验
  • ADF4350频点锁定与电源滤波实战:为什么你的VCO输出有噪声?加个钽电容试试!
  • IT工程/项目计划概要~项目结束表(模版)
  • Swift底层多线程:POSIX线程封装与安全并发实践
  • PLC控制柜制造:从电气设计到自动化稳定运行的完整解析
  • Windows 11/10下VMware Workstation 17开机自启虚拟机完整配置流程(含权限修复与延迟启动设置)
  • 保姆级教程:用树莓派3B+VRPN,把NOKOV动捕数据喂给Pixhawk飞控
  • AI插件深度对比 | Copilot、Tabnine、Codeium谁是王者
  • 手把手教你用STM32的编码器模式,精准读取JGB37-520电机转速(附TB6612驱动配置)
  • XInputTest:精准测量游戏手柄轮询率与延迟的专业工具
  • 2026年比较好的广东非标胶辊定制/设备配套胶辊/自动化设备胶辊厂家精选合集 - 行业平台推荐
  • 告别手动标注!用X-AnyLabeling的AI辅助功能,5分钟搞定100张图片
  • 还在加班撰写述职报告?2026全能AI办公利器,轻松搞定年度述职文稿
  • 从XXE到RCE:手把手拆解Vulnhub靶场中那段‘天书’PHP代码的奥秘
  • Fluent后处理进阶:除了速度云图,教你用‘投影’和‘剔除’分析复杂流动方向
  • 高效Debug:Display策略与工具链实战指南
  • 2026年高抗冲击的PVC发泡型材/PVC型材/PVC密封条型材深度厂家推荐 - 行业平台推荐
  • 2026年比较好的广东印刷胶辊滚筒/包装印刷胶辊/印铁机胶辊/印刷设备胶辊公司哪家好 - 品牌宣传支持者
  • 2026年靠谱的EPDM工业胶辊/设备配套胶辊品牌厂家推荐 - 品牌宣传支持者
  • Redis对象类型与底层数据结构
  • 5个关键挑战:BiliTools跨平台架构如何应对大规模视频下载的性能瓶颈
  • nuScenes数据集“平替”指南:Mini版够用吗?完整版、Test版到底怎么选?