【Usaco 2010 NOV Gold】奶牛的图片

本文探讨了如何通过最少的相邻元素交换次数,将一个n的排列序列优化至首尾相接后形成1~n有序排列的方法。关键在于理解逆序对的概念,及每次交换对逆序对数量的影响,从而确定最少的操作次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:给你一个n的排列,每次可以交换相邻元素,问你最少用多少次能把原序列变成一个首尾相接后存在1~n有序排列的序列。

总结:善于发现移动的不变量。

对于有序化的题目想到逆序对。

 

发现每次交换相邻的两个位置,逆序对都会变化1.

如果我们要把原序列从小到大排序(逆序对为0)的话。因为要步数最少,那么我们肯定每一次移动,都往对逆序对序列贡献为-1的方向走,每次都能找到这种移动方法,所以最少要用逆序对个数次。

 

至于首尾相接后的合法序列,我们可以认为1是n + 1, 2是 n + 2依次类推。

 

当序列最后为 2 3 ... n , 1

等价于 1 - > n + 1

设1的原位置是p, 那么前面比他大的数有p - 1个

变为n + 1后,前面没有比他大的数,后面比他小的数增加了n - p个

所以总逆序对个数增加了n - p - p + 1 个

 

当最终序列最终为3, 4, 5 .. n 1 2

1变成了n + 1, 2变成了n + 2

可以在上面的基础上,把2 变化即可。

 

把1变成n +1后,2就成了最小的数

所以变化量一样。

只要维护每个数出现的位置p

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值