KEI日(C群)(2)

トピック(2)(神の民に最も近いです)

 ひびが入ったルーンワード、小型FFは地面に通じる道を開きました。彼は下に行ったとき、ドア上の古代の人間の活動のいくつかの種類のパターンが刻まれたドアの前で見つかった石が、そこにあります。石門上記の古代のテキストで、「神の神殿」と言います。FF内部の小さな王室の遺産がある必要がありますね。しかし、今の質問は、ドアを開ける方法である......           
       古代の人々は唯一の賢い人は神々の中で最もアクセス可能であることを考える:慎重に検討した後、彼はドアの上のパターンはおそらく言うことがわかりました。しばしば儀式を介して選択された最も知的な人。おそらくそれは儀式を指し、彼の候補者のためのデジタル障害の束を書き留めて、二つの要素隣接配列を入れ替え操作を行うにそれらを許可するように賢明引退しようとしています。そして、交換の最小数を持つ人々は賢明次のシーケンスである元のシーケンスに分類されないようにします。
       小型FF nは桁が同じドアを発見しました。そこで彼は、秘密の扉を開くために考えられ、このシーケンスになるための方法を見つけることです最小数必要なシーケンスを低下させません。しかし、小型FFは......ないだろうし、あなたを見つけなければならなかった、と3つの物事は7後に行うことができますを約束し......

エントリー

最初の整数nを行い、それがの系列長示し
各々が要素のシーケンスを表す、二行目のn整数。

輸出

整数ANS、即ち、操作の最小数。

サンプル入力

4 
2 8 0 3

サンプル出力

3 
サンプル説明:
出発配列は、標的配列は、0238で、2803であり、標的配列の3つの操作を得るために行うことができる:
1.スワップ(8 0):2 0 3 8 
2スワップ(2、0) :0~2 8. 3 
3.スワップ(8 ,. 3):0~2 8. 3

データ範囲の制限

データ1の30%<= N <= 10 ^ 4
データの100%1 <= N - <= ^ 5×10 5;
-maxlongint <= A [I] <= maxlongint。

 考え

このことは、逆問題の標準シーケンスである、あなたはマージソートを使用することができます。

コード

#include <iostreamの> 
する#include <cstdioを> 
する#include <CStringの> 
する#include <アルゴリズム> 
の#include <cmath>
 使用して 名前空間STD。
長い 長い INT [ 500001 ]、R [ 500001 ]、ANS = 0 、N。
ボイド gsort(INT S、INT T)
{ 
    もし、(S ==のT)
     リターン;
    INT半ば=(S + T)/ 2 
    gsort(S、ミッド)。
    gsort(MID + 1 、T);
    int型 I = sで、J =ミッド+1、K =のS。
    しながら、式(I =中間&& J <= < T)
    { 
        場合([i]が<= A [J])
        { 
            R [k]が = [I] 
            I ++ ; 
            K ++ ; 
        } 
        
        { 
            R [k]は = [j]を。
            J ++ ; 
            K ++ ; 
            ANSの =のANS + +ミッドI 1 ; 
        } 
    } 
    ながら(I <= MID)
    { 
        R [K] =[I]。
        I ++ ; 
        K ++ ; 
    } 
    一方、(J <= T)
    { 
        R [k]は = [j]を。
        J ++ ; 
        K ++ ; 
    } 
    のためにint型 I = sで、I <= T; iが++ 
    [I] = R [i]は、
} 
int型のmain()
{ 
    CIN >> N。
    以下のためにint型 i = 1 ; iが= <N; iは++ 
    CIN >> [I]。
    gsort(1、N)。
    coutの << ANS << てendl;
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/abcdhh/p/11299660.html