パス
直感的に、私たちは、AIとできるだけ同じBIを願っています。私たちは、シーケンスはI位にランクし、シーケンスのb私は1つの場所はまだ最高です位にランクされていない、大胆な推測を作ります。そうであることが判明したデータのいくつかのセットを試してみてください
私たちは、タイトル番号を交換しようとしてみましょう。そして、我々は今だけ相対的なランキングを気にするので、元の値は重要ではありません。私たちは、2つの個別の表情の元のシーケンスを入れて1-Nに変わりました。
今では多くの人が同じ順序になるために交換する必要があるか、需要、2 1-Nの列数となります。結論を持っているように見える、我々は別のシーケンスが近くに移動し、2つを変換するように、無傷のまま配列を有し、最良の戦略では、番号は同じです。
それは最高のは何回かそれを交換するために、別のシーケンスにシーケンスを置きますか?私たちは、限り、我々はx回を交換して、シリアル順序になることができるようになり、それがXと逆の順序があると仮定することで、逆の順番を考えます。答えはされていないものの逆の順序で別のシーケンスを求めて、標準を命じたとき、我々は別のシーケンスを持っているのであれば。
標準ケースと配列がマージソート、逆の順序を行うことが不便です。私たちは逆に求める別の方法がありますが、逆はフェンウィックツリーの権利を求めています。スキャンシーケンスを前後には、現在のxのため、木の配列、[X、MAXN]どのように多くの数を参照してください。そして、1つのxのを配置します。この質問は、ちょうど巣の外に、LOC []だけ同じなので、別の逆の権利を追求するための標準的なシーケンスいます。フェンウィックの木のため、それを逆にします。
1の#include <cstdioを> 2の#include <アルゴリズム> 3 使用して 名前空間STDを、 4 のconst int型 MAXN = 110000、MO = 99999997 。 5 int型のn、[MAXN]、B [MAXN]、TP [MAXN]、LOC [MAXN]、TRE [MAXN]、ANS。 6 INT lowbit(INT X) 7 { 8 リターン X& - X。 9 } 10 INTクエリ(INT X) 11 { 12 int型のRES = 0 。 13 のための(; X; X - = lowbit(X)) 14 { 15の RES + = TRE [X]。 16の RES%= MO。 17 } 18の リターンRES。 19 } 20 空隙追加(INT X) 21 { 22 のために(; X <= Nであり、X + = lowbit(x))を 23 TRE [X] ++ ; 24 } 25 のint main()の 26 { 27 のscanf(" %d個"、&N) 28 のために(int型 I = 1 iが<= N; iが++ ) 29 { 30 のscanf(" %dの"、および[I])が、 31 TP [I] = [I]を、 32 } 33 ソート(TP + 1、TP + N + 1 )。 34 のために(int型 i = 1 ; iが<= N; iが++ ) 35 [I] = LOWER_BOUND(TP + 1、TP + N + 1、[I]) - TP。 36 のためには、(int型 i = 1 ; iが<= N; I ++) 37 { 38 のscanf(" %dの"、&B [I])。 39 TP [I] =のB [i]は、 40 } 41 ソート(TP + 1、TP + N + 1 )。 42 のためには、(int型 I = 1は iが++; iがn = < ) 43 { 44 B [I] = LOWER_BOUND(TP + 1、TP + N + 1、[I] B) - TP。 45 LOC [B [I] = I。 46 } 47 のために(INTi = 1 ; iは= <N; iは++ ) 48 { 49の ANS + =クエリ(N - LOC [[I] + 1 )。 50 ANS%= MO。 51 追加(N - LOC [[I] + 1 )。 52 } 53 のprintf(" %Dを\ n " 、ANS)。 54 リターン 0 ; 55 }