cqyzのOJは|フェンウィックツリー|逆転するサイクル|順序を逆にします

  • 説明

  0〜N-1の数字のシーケンス、及びそのような動作は、各時系列に取得するための最終要素の上面、各シーケンスは、一組場合シーケンス番号(の逆を与えるように描くことができます前後逆の順序の数の位置と大きさ、すなわち、後者の前に数より大きい数は、それらが逆と呼ばれる。着信番号の総数の逆の配置は逆の順序で)。要件は、逆の順序で最小の番号を取得します。

  • 入力

データの入力セットを複数備え、各々が2本のデータ線、第一行動整数nは、0..N-1の第2行に配置されています。

  • 出力

逆対の最小数を表す各整数のデータ出力ライン、。

  • サンプル入力1 
10 
1 3 6 9 0 8 5 7 4 2
  • サンプル出力1
16
  • ヒント
N <= 100 000
データの10セットの最大。

1つの従来のアプローチは、マージソートを逆にすることですが、この質問のために、n個のシーケンスn回は、ソートはO(n * n個のLOGN)、タイムアウトに達するまでの時間をマージします。
 
タイトルは、次のシーケンスが最後作ら言及したこれらのシーケンスの最初の要素であると言います
これら2つの配列が変更だけのその要素に変更を逆に持って、同じの多くを逆にする必要があり見つけるのは簡単。
各時間[1]最後に、逆のシーケンス全体が増加B - L対
式中、Bはバックよりも要素の[1]多数ある、すなわち新しい番号に逆
L [1]光素子の、即ち、逆の数を減少させるためにバックの数の比であります
aとb LはO次転写配列の(1)時間で決定することができます
 
フェンウィックツリーは、要素の数[i]が小さい(L [i]は、R [i])と比べて、左右の[i]を得るために使用することができます
次いで、[i]は、左側に、それがDLの多数するよりも、[I] = I-1-L [i]は、右側は、DRの数よりも多い[I] = NIR [I]
 
[1]が順次逆ANSの最後に述べたシーケンス番号の各要素の後に計算されます
则B = DL [I] + DR [i]は、L個の= L [I] + R [i]は
転送:ANS = ANS +(B - L)
  =のANS +(DL [I] + DR [I] - L [I] - R [i])と
  ANS = +((I-1 L [I])+(NIR [I]) - L [IN] - R [i])と
  =年+(N - 1 - 2 *(L [I] + R [I]))
 
初期状態を計算する必要がありますANS1 = SUM(R [I])又は和(I-1-L [i])と
答えはANS最小を取ることができます
 
#include <iostreamの> 
する#include <cstdioを> 
する#include <cmath> 
の#include <CStringの> 
する#include <ベクトル> 
の#include <アルゴリズム>
 の#define MAXN 100005
 の#define MAXM 100005
 の#define lowbit(X)(X&( - X) )
 の#define FOR(iは、b)のための式(I =(A INT); iが<=(B);を++ I)
 の#define ROF(I、B)(I =(A int型の場合)。 I> =(B); - I)の
 使用 名前空間STDを、
typedefの長い 長いLL。
int型のn、[MAXN]。
INT [MAXM] C。
INTをL [MAXN]、R [MAXN]。
無効アドオン(int型P){
     一方(p <= N)C [P] ++、P + = lowbit(P)。
} 
int型の照会(INT P){
     int型 ANS = 0 しばらく = - (P)ANS + = C [P]、P ; lowbit(P)
    戻るANSを。
} 
int型のmain(){
     一方(scanf関数(" %のD "、&​​N)== 1 ){ 
        (I、FOR 1、N)のscanf(" %dの"、および[I])、[I] ++ ; 
        memset(C、0はsizeof(c)参照)。(I、FOR 1、n)をL [I] =クエリ([i]は- 1 )、(追加[I])。
        memset(C、0はsizeof(c)参照)。ROF(I、nは、1)R [i]は、クエリ=([I] - 1 )、([I])を追加します。
        LL ANS = 0 、TMP。
        (I、FOR 1、N)ANS + = [I] R。
        TMP = ANS; 
        (I、FOR 1、N- 1 ){ 
            TMP - + = N 1 - 2 *(L [I] + R [I])。
            ANS = 分(ANS、TMP)。
        } 
        のprintf("%LLD \ n " 、ANS); 
    } 
    戻り 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/de-compass/p/11426247.html