P2448無限の生命(フェンウィックツリー+ディスクリート)

タイトル説明

失われた時間は、時計の周りになることはありません!

Yeliangチェンは、彼の人生は無限に長いと考えている、と日々進行します。

人生Yeliang陳の最初の日、彼は一点を評価する能力を持っています。翌日、2点があります。N番目の日、n点があります。S [i]は=私はあります

いたずら少ししかし、タイムマシンを使用し、X-Y曜日と彼に言われた、あなたは一日のいずれかの能力値を入れ替えることができます。即ち、S [X] < - > S [Y]

このゲームはプレイする小さな遊び、最終的に疲れました。

Yeliang陳:あなたは私を待って小さな、私はあなたの生活の死を作る方法の100種類を持っています。あなたは1秒以内にどのように多くのペア伝えることができない限り、「例外にします。」換言すれば、能力は、ペアの2日x個、Y、X <Yが、S [X]の値に機能> S [Y]を値のシーケンスが続きますか?

小A:私はとても緊張ああです。

だから私はあなたを見つけます。

入出力フォーマット

入力フォーマット:

最初の行の整数k、何回小さな遊びAタイムマシンを示しています

次のk行、X_I、Y_Iは、SとS [X_I]交換を示している[Y_I]

出力フォーマット:

どのように多くの「例外に」

サンプル入力と出力

入力サンプル#1: コピー
2 
4 2 
1 4
出力サンプル#1: コピー
4

説明

サンプル説明

123 456から始まります...

その後、143256 ...

その後、243156 ...

マッチングペアがある[14] [23] [24] [34]

データの30%、X_I、Y_I <= 2000

データの70%、X_Iため、Y_I <= 100000

データの100%に、x_i.y_i <= 2 ^ 31-1 K <= 100000

6024

ソリューション:微妙な嘘を理解するためには、ラフ紙の上に、主に、独自のシミュレーション以上の方法を、ステレオタイプ!

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
typedefの長い 長いLL。
const  int型 MAXN = 100010 ;
INTハッシュ[MAXN << 1 ]、C [MAXN << 1 ]、LSH [MAXN << 1 ]。
INT CNT、上面、N、M。 < INTINT > P [MAXN]。
INT lowbit(INT X){ 戻り X& - X;}
 ボイド更新(int型のx、int型V)
{ 
    ためINTI = xで、I <= M; iは+ = lowbit(I))
        C [I] + = V。
} 
LL和(INT X)
{ 
    LL ANS = 0 int型 ; I> = I = xを1、I- = lowbit(I))
        ANS + = C [i]は、
    戻るANSを。
} 
int型のmain()
{ 
    int型K。
    cinを >> K;
    以下のためにint型 i = 1 ; iは= Kを<; iは++ ){ 
        CIN >> P [i]が1次回>> P [i]は.second。
        ハッシュ[CNT ++] = P [I] 1次回; 
        ハッシュ[ ++ CNT] = P [I] .second; // 最初の配列は、重複排除を選別した後、ハッシュを配置している
    } 
    (ハッシュソート + 。1、ハッシュ+ 1 + CNT); 
    M = UNIQUE(ハッシュ+ 。1、ハッシュ+ 1 + CNT)-Hash- 1。;
     のためのINT I = 1 ; I <= M、Iが++)LSH [I] = I; // 元の状態を記録
    するためにint型 I = 1 ; Iは= Kを<; Iは++ ){
         int型 POS1 = LOWER_BOUND(ハッシュ+ 1、ハッシュ+ 1 + M、P [I] 1次回) - ハッシュ。
        INT POS2 = LOWER_BOUND(ハッシュ+ 。1、ハッシュ+ 1 + M、P [I] .second) - ハッシュ; 
        スワップ(LSH [POS1]、LSH [POS2]); // 操作を対応する対応位置を見つける
    } 
    LL ANS = 0 INT I = M、I> = 1 ; i-- ){ 
        ANS + = SUM(LSH [I] - 1。); // 逆上の一点を求める 
        (LSH [I]、更新する。1); // 更新一点 
        LL = LENハッシュ[I] -hash [I- 1 ] - 1 ; //は、連続的なインターバル長見つける 
        ANS + = * lenのSUM(I- 。1)。// Iこの数として考えることができ、連続不変のセクション、!
        IF(I =!1)アップデート(I- 1、LEN); // 最後に更新されない(lowbit 0が0であるため、更新サイクルで更新されていないが、死んでしまう)
    } 
    coutの << ANS << てendl ;
     戻り 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/cherish-lin/p/10964431.html