0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Atcoder】ABC 350 C問題

Last updated at Posted at 2024-04-22

コンテスト名

AtCoder Beginner Contest 350

考えたこと

整数の組 (i,j) をswapしてsortする

選択ソート?

結果
計算量$O(n^2)$なので当然TLE

次に考えたこと

ヒープソートを使う

結果
heapqを使えばsortだけならいけそうだが、問題文に
$「l 回目の操作で選ぶ整数 i,j を空白区切りで出力せよ。」$
と書いてあるので(自分には)不可能。

公式解説

https://atcoder.jp/contests/abc350/editorial/9810?lang=ja
https://atcoder.jp/contests/abc350/editorial/9832

考察

なるほど。そもそも最小値を見つける必要がなく、必ずi番目の数字はiになる訳か。(当たり前)
ただ、$「現在 A の中で i がどこにあるか」$を探す際にindexメゾットを使うと
$O(n^2)$になってしまうから「A の中で値 i がある位置を表す配列」を用意する必要があるわけね。

ということで公式解説の間違い例
https://atcoder.jp/contests/abc350/editorial/9832
を使って書き換えました。

n=int(input())
a=list(map(int,input().split()))
answer=[]

pos=[0]*(n+1)
for i in range(n):
    pos[a[i]]=i
for i in range(n):
    if a[i]!=i+1:
        idx=pos[i+1]
        a[i],a[idx] = a[idx],a[i]
        pos[a[i]],pos[a[idx]]= pos[a[idx]],pos[a[i]]
        answer.append((i+1,idx+1))

print(len(answer))
for a in answer:
    print(*a)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?