luogu_P3224 [HNOI2012]ネバーランド

互いに素セット保守区間の木の合併

プラスbでは

#include <iostreamの> 
する#include <cstdioを> の#define RI登録INT
 の#define U INT 名前空間OPT { 
    インラインU における(){ 
        UX(0)、F(1 )。
        チャーS(GETCHAR())。
        一方、(S < ' 0 ' || S> ' 9 ' ){
             もし、(S == ' - ')、F = - 1 
            S = GETCHAR()。
        } 一方、(S> = ' 0 '





        && S <= ' 9 ' ){ 
            X =(X << 1)+(X << 3)+ S- ' 0 ' 
            S = GETCHAR()。
        } 
        戻り X * F。
    } 

} 

使用してオプトインを:: 

#define NN 100005の名前空間XDS { 構造体ノード{ 
        UL、R、和、追加。
    } [NN << 6 ]。
    U NUM、ANS [NN]、腐敗[NN]。プッシュダウン(のconst U&RT、constの U&L、



    


    CONST U&R){
         場合([RT] .add){
             なら!)[RT] .L([RT] .L = ++ NUM。
            もし(![RT] .R)[RT] .R = ++ NUM; 
            U半ば((L + R)>> 1 )。
            [RT] .L] .add + = A [RT] .add。
            [RT] .R] .add + = A [RT] .add。
            [RT] .L] .SUM + = A [RT] .add *(MID-L + 1 )。
            [RT] .R] .SUM + = A [RT] .add *(R- MID)。
            [RT] .add = 0 
        } 
    } 

    ボイド更新(U&RT、CONST、U&LをCONST、U&R CONST、U&X CONST、U&Y のconst U&K){
         場合(RT)RT = ++!NUM。
        場合(L> = X && R <= Y){ 
            [RT] .SUM + = K *(R-L + 1)、[RT] .add + = K。
            リターン; 
        } 
        プッシュダウン(RT、L、R)。
        U半ば((L + R)>> 1 )。
        もし(x <= MID)更新([RT] .L、L、中、X、Y、K)。
        もし(Y> =ミッド+ 1)の更新は、([RT] .R、中間+ 1 、R、X、Y、K)。
        [RT] .SUM= [RT] .L] .SUM + [RT] .R] .SUM。
    } 

    Uクエリ(CONST U&RT、CONST U&L、CONST U&R、CONST U&K){
         場合(K> [RT] .SUM)リターン - 1 もし(L == R)戻りANS [L]。
        プッシュダウン(RT、L、R)。
        U半ば((L + R)>> 1 )。
        もし([RT] .L] .SUM> = k)の戻りクエリ([RT] .L、L、中、K)。
         戻りクエリ([RT] .R、中間+ 1、R、K-[RT] .L] .SUM)。
    }

     _x;ボイドマージ(U&X、CONST U&Y){
         場合(X ||!Y){
             場合(X!)X = Y。
            リターン; 
        } 
        [X] .SUM + = [Y] .SUM、[X] .add + = [Y] .add。
        マージ([X] .L、[Y] .L)、マージ([X] .R、[Y] .R)。
    } 

} 

名前空間CAS { 

    U FA [NN]。

    U getfa(UX){ 
        U _x(x)は、K。
        一方、(_x ^ FA [_x])_x = FA [_x]。
        一方、(X ^ _x)K = FA [X]、FA [X] = _ X、X = K。
        リターン
    } 

} 

名前空間の主力{

    UV [NN]。

    使用して 名前空間のCASを。
    使用して 名前空間のXDSを、

    インラインボイド(){解決
        U N(())、M(中に)();
        (RI I(1); I <= N; ++ I)FA [I] = I。
        (RI I(1 V [I] =; I <= N ++ I)))(ANS [Vを[I] = I、更新(腐敗[getfa(I)]、1、N、 V [i]は、V [i]は、1 )。
        (RI I(1 ; I <= M ++){I)
            U _a(())、_ B(もし())。
            (getfa(_a)^ getfa(_B)){ 
                マージ(腐朽[getfa(_a)]、腐敗[getfa(_B)])。
                FA [getfa(_B)] = getfa(_a)。
            } 
        } 
        (U Q ())。
        一方、(Q-- ){
             チャー_s(GETCHAR())。
            しばらく(!_s = ' Q '!&& _ S = ' B ')_s = getchar関数(); 
            U _a(())、_ B()();
            もし(_s == ' Q '){ 
                のprintf(" %dの\ n "、クエリ(腐敗[getfa(_a)]、1 、N、_B))。
            } {
                 場合(getfa(_a)^ getfa(_B)){ 
                    マージ(腐朽[getfa(_a)]、腐敗[getfa(_B)])。
                    FA [getfa(_B)] = getfa(_a)。
                } 
            } 
        } 
    } 

} 

int型のmain(){ 

    // freopenは( "X.TXT"、 "R"、標準入力)。
    // freopenは( "my.txt"、 "W"、STDOUT)。
    std ::イオス:: sync_with_stdio(); 
    主力::(解決)。

}

 

おすすめ

転載: www.cnblogs.com/ling-zhi/p/11844655.html