• CF1375E Inversion SwapSort


    题意

    给定一个长度为 $n$ 的序列 $a$,求 $a$ 中的所有逆序对 $(i_1, j_1), (i_2, j_2), cdots, (i_m, j_m)$ 的一个排列 $p$, 使得依次交换 $(a_{i_{p_1}}, a_{j_{p_1}}), (a_{i_{p_2}}, a_{j_{p_2}}), cdots, (a_{i_{p_m}}, a_{j_{p_m}})$ 后序列单调不降。

    $1 le n le 10^3$,$1 le a_i le 10^9$。

    题解

    前情提要 link1  link2 他帮忙证了证 有可能更详细(

    有一位好鸽鸽告诉我证法了!orz jiangly。(但复杂度不太对。

    方法一

    大家普遍的写法。先考虑 $a_i$ 为 $n$ 排列的情况。

    设 $p=a^{-1}$ ,那么 $p_i$ 表示在 $a$ 中为 $i$ 出现的位置。

    可以发现 $p$ 与 $a$ 的逆序对是一一对应的,实质上是 $a$ 的下标与 $p$ 的元素构成双射。

    证明也十分简单,若 $p_i>p_j,i<j$ ,由于 $a_{p_i}=i,a_{p_j}=j$ ,那么在 $a$ 中 $(i,j)$ 构成了逆序对,同理可得无法构成逆序对。

    那么 $p$ 与 $a$ 之间的关系构成了一个双射。

    由于题意是对于 $a$ 的下标交换,那么即为对 $p$ 的元素交换,而当 $a$ 为 $[1,2,...,n]$ 后 $p$ 即为 $[1,2,3,...,n]$ 。   

    则对 $p$ 进行冒泡变为 $[1,2,3...,n]$ 即可解决问题。

    若 $a_i$ 不为 $n$ 的排列那么离散化一下,并且相同的钦定下标小的小即可。

    复杂度 $mathcal O(n^2)$ 。 

    方法二

    再次 %jiangly 。 

    前情提要的做法本质上和方法一类似,可以发现最后 $id$ 相当于 $a^{-1}$ 。

    那么毛估估一下就可以得到其实就是方法一倒过来并且跑的还慢的做法。

    事实上就是将方法一的做法倒过来,并且改成冒泡排序就一模一样啦。

    时间复杂度 $mathcal O(n^3)$ ,别问为啥跑过去了。

  • 相关阅读:
    java线程上
    java常用类
    java面向对象4
    java 面向对象三
    java面向对象下
    java面向对象
    java基础下
    Java之Stream流
    JAVA泛型
    英语
  • 原文地址:https://www.cnblogs.com/si-rui-yang/p/14420223.html
Copyright © 2020-2023  润新知