CF1375E Inversion SwapSort
题意
给定一个长度为 n 的序列 a,求 a 中的所有逆序对 (i1,j1),(i2,j2),⋯,(im,jm) 的一个排列 p, 使得依次交换 (aip1,ajp1),(aip2,ajp2),⋯,(aipm,ajpm) 后序列单调不降。
1≤n≤103,1≤ai≤109。
题解
前情提要 link1 link2 他帮忙证了证 有可能更详细(
有一位好鸽鸽告诉我证法了!orz jiangly。(但复杂度不太对。
方法一
大家普遍的写法。先考虑 ai 为 n 排列的情况。
设 p=a−1 ,那么 pi 表示在 a 中为 i 出现的位置。
可以发现 p 与 a 的逆序对是一一对应的,实质上是 a 的下标与 p 的元素构成双射。
证明也十分简单,若 pi>pj,i<j ,由于 api=i,apj=j ,那么在 a 中 (i,j) 构成了逆序对,同理可得无法构成逆序对。
那么 p 与 a 之间的关系构成了一个双射。
由于题意是对于 a 的下标交换,那么即为对 p 的元素交换,而当 a 为 [1,2,...,n] 后 p 即为 [1,2,3,...,n] 。
则对 p 进行冒泡变为 [1,2,3...,n] 即可解决问题。
若 ai 不为 n 的排列那么离散化一下,并且相同的钦定下标小的小即可。
复杂度 O(n2) 。
方法二
再次 %jiangly 。
前情提要的做法本质上和方法一类似,可以发现最后 id 相当于 a−1 。
那么毛估估一下就可以得到其实就是方法一倒过来并且跑的还慢的做法。
事实上就是将方法一的做法倒过来,并且改成冒泡排序就一模一样啦。
时间复杂度 O(n3) ,别问为啥跑过去了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步