C - Sort Editorial by mymelochan

Pythonで解く場合の注意点

Pythonでこの問題を解く際に次のように書いてしまい、TLEした人が多いのではないでしょうか。

ans = []
for i in range(N):
    if A[i] == i+1:
        continue
    idx = A.index(i+1)
    A[i],A[idx] = A[idx],A[i]
    ans.append((i+1,idx+1))

print(len(ans))
for a in ans:
    print(*a)

実は配列クラスのindexメゾットの計算量は最悪で\({O(配列の要素数)}\)掛かってしまうので、上記のコードの全体の最悪計算量は\({O(N^{2})}\)となってしまいます。今回の制約の場合、最悪で\(N^2 ≃ 10^{10}\)回ほど計算しなければいけなくなり、とても実行制限時間2秒に間に合いません。

これを回避するためには、次のような要素数\(N\)の配列\(B\)を新たに定義すればよいです。

  • 整数\(i+1\)は配列\(A\)\(B[i]\)番目に存在する。

こうすることで計算量は\(O(N)\)となり十分高速にこの問題を解くことができます

posted:
last update: