P9422 合并数列题解复盘 📅 2026/7/13 1:34:37 基本信息项目内容题目编号、来源蓝桥杯决赛D题 数组合并相同 / 第十四届蓝桥杯CB组训练层级B 双指针贪心模拟知识版块贪心、队列、前缀和分段匹配解题前・关键信号识别维度分析目标、约束、底层结构目标通过相邻合并操作让两个数组完全相同求最少合并次数约束只能合并相邻两个数字合并后数值为两数之和两数组总和相等底层结构双队列分段匹配哪边队首和小就合并下一段直到两端相等再同时弹出。数据规模n,m ≤ 1e5必须O(nm)线性算法暴力模拟/前缀和二分会超时双队列单次遍历最优。候选算法和依据双队列贪心分段依据两段前缀和不相等时只能合并后方相邻元素每合并一次计数1两端相等说明分段匹配完成同时弹出队首。复杂度预判O(nm)每个元素仅入队、出队一次空间复杂度O(nm)存储两个队列。解题后・外化复盘从会一次到稳定会维度内容实现结构 / 核心思路第一步分别将两个数组存入队列第二步循环对比两个队首若左队首更小合并左队列下一个元素合并次数1若右队首更小合并右队列下一个元素合并次数1若相等则同时弹出两个队首第三步队列为空时输出总合并次数。因为只能进行加操作而且和是一样的所以只要小的数不断往后加直至相等就可以错因回溯逻辑 BUG / 代码实现 BUG代码BUG队列为空时还访问front()数组越界忘记加速cin大数据超时。边界和易错点1. 保证两数组总和相等题目保证无需额外判断2. 每次只能合并当前队列相邻后一位不能跨多段3. 1e5大数据建议加ios::sync_with_stdio加速输入4. 相等时同时弹出代表一段匹配完成不增加合并次数。下次看到什么信号我应该想到这个方法看到「两个数组总和相等、相邻合并、使分段完全一致、求最少合并次数」直接用双队列贪心分段匹配。AC 完整代码#includeiostream#includealgorithm#includequeueusingnamespacestd;intn,m;queuelonglongv1,v2;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intans0;cinnm;for(inti0;in;i){longlonga;cina;v1.push(a);}for(inti0;im;i){longlonga;cina;v2.push(a);}while(!v1.empty()!v2.empty()){if(v1.front()v2.front()){longlongav2.front();v2.pop();v2.front()a;ans;}elseif(v1.front()v2.front()){longlongav1.front();v1.pop();v1.front()a;ans;}elseif(v1.front()v2.front()){v1.pop();v2.pop();}}coutans;return0;}