問題文を少し変えるだけで解法が大きく変わる問題(ソートをするために必要なコスト)

以下の2つの問題があります。それぞれどう解くでしょうか?

問題1

$N$を正の整数とする。$0,\ldots,N-1$を並び替えた順列を$a_0,\ldots,a_{N-1}$とする。

このとき、以下の操作を行うことができる

操作:$0\leq i\lt N-1$を一つ選んで、$a_i$と$a_{i+1}$をスワップする

$a_0,\ldots,a_{N-1}$をソートするために必要な操作回数の最小値を求めよ。

 

制約

$1\leq N\leq 2\times 10^5$

$(a_0,\ldots,a_{N-1})$は順列

 

問題2

$N$を正の整数とする。$0,\ldots,N-1$を並び替えた順列を$a_0,\ldots,a_{N-1}$とする。

このとき、以下の操作を行うことができる

操作:$0\leq i\lt j\leq N-1$を一つ選んで、$a_i$と$a_j$をスワップする

$a_0,\ldots,a_{N-1}$をソートするために必要な操作回数の最小値を求めよ。

 

制約

$1\leq N\leq 2\times 10^5$

$(a_0,\ldots,a_{N-1})$は順列

これら2つの問題の相違点は行える操作だけです。それ以外は全て同じ。

 


問題1の解答

これは競技プログラミングの典型で、バブルソートの交換回数と呼ばれるものです。単純に転倒数を求めればよいです。これはBITを使うことで計算ができます。

gist.github.com

 

問題2の解答

これは、順列をサイクルに分解したときの$N-(サイクルの数)$で求めることができます。手法はいろいろありますが、UnionFindを使うと計算できます。

gist.github.com

 

最後に

微妙に問題文を変えるだけで必要になってくるライブラリが全く別のになってしまうの、面白くないですか?

ちなみにライブラリの詳細→GitHub - shakayami/ACL-for-python