fork download
  1. 入れ替える場所をa,b(a<b)と置きます。
  2. やって意味のある入れ替えはとりあえず N[a] < N[b] になってないとダメです。(以下こうなってることを仮定)
  3. また
  4. - (a,b) (a,b') の2つの入れ替えがあった時 N[b] と N[b'] を比較して大きいほうがお得です。
  5. - (a,b) (a,b') (ただしN[b]==N[b'])の場合は bとb'を比較して大きいほうが方がお得です。
  6. - (a,b),(a',b') (ただしa<a')の場合これはN[a],N[b],N[a'],N[b']の値に限らず(a,b)の方がお得になります。
  7. よってaを先頭から全部試してa<bでN[b]が一番大きくなってかつもっとも右にあるbを計算してN[a] < N[b]になっていればswapして終わりです。
  8. これを単純にやるとO(n^2)
  9.  
  10. ただし毎回bを計算する必要はなくて例えば
  11. maxIndex[a] := N[a+1],N[a+2],N[a+3]...値が一番大きく かつ もっとも右側にあるインデックス
  12. みたいなものを定義して、aが大きい方からこの配列を埋めていけば
  13. 全体でもO(n)で解けます。
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty