P3369 [テンプレート]一般的なバランスの取れたツリーバランスの取れたツリー

  

タイトル説明

あなたは、次を提供する必要がある番号の一部を維持するために、(タイトルの主題を参照)のデータ構造を記述する必要があります。

  1. 挿入のx 数xを
  2. 削除X-に(複数の場合にのみ削除するので、同じ番号)X-数
  3. クエリーXのランク数X(ランク数を現在の数の数の比として定義される小+ 1 + 1の場合、複数の同じ数、最小出力ランクため)
  4. ランク付けされたクエリのx 数x
  5. シークX X前駆体(未満として定義前駆X X、および最大数)
  6. シークX Xの(後続よりも大きいとして定義後継XのX、最小数)

入力形式

最初の行のn 数n、操作、次のnはn行それぞれが持っている二つの数字が選ぶO P T及びX 、Xは、オプトO P Tは、操作のシリアル番号(表わす  。1 \のLeq OPT \ 1当量6 。1 O P T 6)

出力フォーマット

動作のため3,4,5,6- 3 4 5 6行あたりの出力数、それに対応する回答を示し

サンプル入力と出力

入力#1
10 
1 106465 
4 1 
1 317721 
1 460929 
1 644985 
1 84185 
1 89851 
6 81968 
1 492737 
5 493598
出力#1
106465の
84185 
492 737 


バランスウェイトテンプレートツリーのメンテナンスの問題
#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
// BXDによる入力
の#define担当者(iは、b)のための(; iは=(b)の<I ++はiは(A)= INT)
 の#defineためreppを(I、B)(I =(A int型); I> =(B); - I)
 の#defineが長い長いちゃう
 の#define(X)(CERR <<(#xを)参照<< '=' <<(X)<< ENDL)
 の#define PB一back
 #define INF 0x3f3f3f3f
 の#define CLR(A、V)のmemset(A、V、Aはsizeof)
のtypedef対 < INTINT > PII。
///////////////////////////////// / 
CONSTの INT N = 2E6 + 10 


int型の息子[N] [2 ]、FA [N]、SIZ [N]、CNT [N]、ヴァル[N]、NCNT、ルート。

INT CHK(INT X)
{ 
    戻り息子[FA [X]] [ 1 ] == X。
} 

ボイドアップ(INT X)
{ 
    SIZ [X] = SIZ [息子[X] [ 0 ]] + SIZ [息子[X] [ 1 ] + CNT [X]。
} 

ボイド回転(INT X)
{ 
    int型、Y = FA [X]、Z = FA [Y]、K = CHK(x)は、W =息子[X] [K ^ 1 ]。
    息子[Y] [K] = W; FA = [W] Y。
    息子[Z] [CHK(Y)] = xと; FA [X] = Z; 
    息子[X] [K ^ 1] = Y; FA [Y] =のX。
    アップ(x)は、アップ(Y)。
} 

ボイドスプレイ(int型のx、int型ゴール= 0 
{ 
    ながら(!FA [X] = 目標)
    { 
        int型、Y = FA [X]、Z = FA [Y]。
        もし(Z =!目標)
        { 
            場合(CHK(Y)== CHK(Z))(y)を回転させます。
            他の回転(x)は、
        } 
        回転(X)
    } 
    もし(!ゴール)ルート=のX; 
} 

のfind(int型x)は
{ 
    場合(!ルート)のリターン;
    int型の POS = ルート。
    一方、(息子[POS] [X>ヴァル[POS] && X =!ヴァル[POS])
    POS =息子[POS] [X> ヴァル[POS]。

    スプレイ(POS)。
} 


ボイドインサート(INT X)
{ 
    int型の POS =ルート、P = 0 一方(POS &&ヴァル[POS] =!X)
    { 
        P = POS。
        POS =息子[POS] [X> ヴァル[POS]。
    } 
    であれば(POS)CNT [POS] ++ ;
    他の
    { 
        POS = ++ NCNT。
        もし(P)息子[P] [X>ヴァル[P] = POS。
        息子[POS] [ 0 ] =息子[POS] [ 1 ] = 0 
        ヴァル[POS] = xと; FAは[posが= P。
        CNT [POS] = SIZ [POS] = 1 
    } 
    スプレイ(POS)。
} 

INT k番目(INT K)
{ 
    int型の POS = ルート。
    一方、1 
    { 
        場合(息子[POS] [ 0 ] && SIZ [息子[POS] [ 0 ]> = K)
        POS =息子[POS] [ 0 ]。
        それ以外の 場合(K> SIZ [息子[POS] [ 0 ] + CNT [POS])
        K - = SIZ [息子[POS] [ 0 ] + CNT [POS]、POS =息子[POS] [ 1 ]。
         {スプレイ(POS)。戻りPOSを;} 
    } 
} 


int型のプレ(INT X)
{ 
    (x)を見つけます。
    もし(ヴァル[ルート<x)の戻りルート。
    int型 POS =息子[ルート] [ 0 ];
    一方、(息子[POS] [ 1 ])POS =息子[POS] [ 1 ]。
    スプレイ(POS)。返すPOSを。
} 

int型の SUCC(INTX)
{ 
    (x)を求めます。
    もし(ヴァル[ルート]> x)の戻りルート。
    int型 POS =息子[ルート] [ 1 ];
    一方、(息子[POS] [ 0 ])POS =息子[POS] [ 0 ]。
    スプレイ(POS)。返すPOSを。
} 

ボイド削除(INT X)
{ 
    int型最後=プレ(X)、NEX = SUCC(X)。
    スプレイ(最後);スプレイ(NEX、最後の); 
    int型 POS =息子[NEX] [ 0 ];
    もし(CNT [POS]> 1 
    { 
        CNT [POS] - スプレイ(POS);
    } 
    さもなければ息子[NEX] [ 0 ] = 0 
    アップ(ルート);アップ(NEX)。
} 

ボイドランク-1(INT X)
{ 
    (x)を見つけます。
    もし(ヴァル[ルート<= X)のprintf(" %d個の\ n "、SIZ [息子[ルート] [ 0 ]])。
    そう であれば(ヴァル[ルート]> X)のprintf(" %d個の\ n "、SIZ [息子[ルート] [ 0 ] + CNT [ルート])。


INT のmain()
{ 
    int型の M; CIN >> M。int型、B; 
    (挿入0x3f3f3f3f )。
    (挿入0xcfcfcfcf);
    一方、(M-- 
    { 
       scanf関数(" %D%dの"、&​​、&B)。
        もし(== 1 )(b)の挿入;
        場合(== 2 )を除去(B)
        もし(== 3 )ランク-1(B)
        もし(== 4)のprintf(" %d個の\ n "、ヴァル[k番目(B + 1 )])。
        もし(== 5)のprintf(" %d個の\ n " 、ヴァル[プレ(B)])。
        もし(== 6)のprintf("%d個の\ n "、ヴァル[SUCC(B)])。
    } 
    戻り 0 
}
コードの表示

 





おすすめ

転載: www.cnblogs.com/bxd123/p/11297914.html