火柴排队
这道题目看到题干就知道跟逆序对相关了
首先考虑最终的等式会是怎么样的
既然要成为同序和,我们将两个序列中值相同的连边,比如
那么最终我们要让所有边都是竖直的
由于很像逆序对,我们考虑这里的逆序对是什么
不难看出是有交叉,即用一个二元组
那么就是序列中存在两个二元组
首先有逆序对肯定不是最终序列
我们再证明没有逆序对了一定是最终序列
在没有逆序对的序列中,由于不存在逆序对,所以对
我们再来证明如果一个序列有逆序对,那么一定存在相邻逆序对
反证,如果不存在相邻逆序对,即对
我们的一次操作显然最多使逆序对减少一,所以逆序对个数是下限,而我们每次操作相邻逆序对就可以达到这个下限
所以没啥想法可以考虑转换成图论想一想
然后解释一下洛谷题解以
首先我们先证明,任何一种操作方式,如果同时操作了两个序列,设操作此时为
我们不妨尝试将对
我们考虑最后一次操作
我们一直这么转换,最后肯定就可以不操作
所以我们考虑如何只操作一个数组来达到最优
最优的时候肯定是
那么我们对
1 3 4 2
1 4 2 3
那么最终我们是要将1 3 4 2
的,也就是说1
要放到第一个位置,3
要放到第二个位置,4
要放到第三个位置,2
要放到第四个位置(这里从1 3 4 2
(1 2 3 4
,1 2 3 4
,当然就是求逆序对了
这种抽象也告诉了我们一种一般的做法:将一种序列通过相邻交换到另一种序列的最小交换次数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构