BZOJ 1180/2843 LCTテンプレートのタイトル_ダブル経験

早朝に部屋が温まるまで、テンプレートを平手打ちしたいと思います。

結果は....輝くステンドLCTでも人生をノックすると死が最後の曲ではありません(私が間違ってコピーをコピーしたと言うことができます)

単に自分のQiaowanへ10分、再び再ノック.......

それでも自分を信じする必要が

コード:

#include <ビット/ STDC ++ H> 
に#define setIO(S)freopenは(S ".IN"、 "R"、STDIN)
名前空間stdを使用。
  #define MAXN 40000 
構造体LCT 
{ 
    の#define LSONのCH [X] [0] 
    の#define rsonのCH [X] [1] 
    INTタグ[MAXN]、ヴァル[MAXN]、sumv [MAXN]、CH [MAXN] [2] 、F [MAXN]、STA [MAXN]。
    INT isRoot(INT X)
    { 
        返す(CH [F [X]] [1] == X || CH [F [X]] [0] == X)!。
    } 
    INT GET(INT X)
    { 
        戻りCH [[X] F] [1] == X。
    } 
    のボイドマーク(int型x)は
    { 
        (!x)の場合はリターン。
        スワップ(LSON、rson)、タグ[X] ^ = 1; 
    } 
    ボイドプッシュダウン(int型X) 
    {
        (!x)を返した場合、
        IF(タグ[X])
        { 
            マーク(LSON)、マーク(rson)、タグ[X] ^ = 1; 
        } 
    } 
    ボイド押し上げ(INT X)
    { 
        sumv [X] = sumv [LSON] + sumv [rson] + valの[X]。       
    } 
    ボイド回転(INT X)
    { 
        int型古い= F [x]は、(X)を取得=れ、= F [古い]を折ります。
        (!isRoot(旧))であればCH [倍] [CH [倍] [1] ==古い] = xと; 
        CH [古い] [] = CHを[X] [^ 1]、F [CH [古い] [た] =古いです。
        CH [X] [X]倍= F、古い、F [古い] = xを= [どの^ 1]。
        腕立て伏せ(旧)、腕立て伏せ(x)は、
    } 
    ボイドスプレイ(INT X)
    { 
        int型、U = X、V = 0。 
        STA [++ V] = U。
        (!isRoot(U))一方、STA [++ V] = F [U]、U = F [U]。
        一方、(V)プッシュダウン(STA [v--])。
        UはFを= [U]。
        以下のために(!int型のFA(FA = F [x]は)= uが、回転(x))が
            あれば(F [FA] = U!)回転(取得(FA)==取得(x)がFA:?x)は、
    } 
    ボイドアクセス(INT X)
    { 
        ため(INT Y = 0; X; Y = X、X = F [X])
        { 
            スプレイ(X)、rson = Y、押し上げ(X)。
        } 
    } 
    ボイドmakeRoot(INT X)
    { 
        アクセス(X)、スプレイ(X)、マーク(X)。
    } 
    ボイドリンク(INT A、INT B)
    { 
        [A] = B F makeRoot(A)。 
    {
    }
    無効スプリット(int型B、int型)
        makeRoot(a)は、アクセス(B)、スプレイ(b)は、
    } 
} T。
構造体Union_Find 
{ 
    INT P [MAXN]。
    INITを無効()
    { 
        [I] = iがP(++ iは; iがMAXNを<I = 0をINT)ため、
    } 
    INT(INT X)を見つける
    { 
        戻りP [X] == X?X:P [X] =(pは、[X])を見つけます。
    } 
    int型のマージ(INT A、INT B)
    { 
        int型のx =検索(a)は、Y =(B)を見つけます。
        (x == y)が0を返す場合。
        P [X] = Y。
        1を返します。
    } 
} U。
文字列str [20]。
INTメイン()
{ 
    // setIO( "入力")。 
    U.init()。
    int型のn; 
    scanf関数( "%のD"、&N);
    ( "%d個"、&T.val [i])とのscanf、T.sumv [I] = T.val [I]のために(++ I; iは= N <I = 1 INT)。
    int型Q、A、B、C。
    scanf関数( "%のD"、&Q)。
    (Q - )一方
    { 
        scanf関数( "%sの"、STR)。
        IF(STR [0] == 'B')
        { 
            scanf関数( "%D%dの"、&、&B)。
            もし(U.merge(a、b)は!)
                のprintf( "なし\ nを"); 
            { 
                T.link(B)
                printf( "はい\ N"); 
            } 
        } 
        (STR [0] == 'P')であれば
        { 
            scanf関数( "%D%dの"、&、&B)。      
        }
            scanf関数( "%D%dの"、&、&B)。
            IF(U.find(A)== U.find(B))
            { 
                T.split(B)
                printf( "%Dを\ n"、T.sumv [B])。
            }他のprintf( "不可能\ nを"); 
        } 
    } 
    0を返します。
}

  

おすすめ

転載: www.cnblogs.com/guangheli/p/10928833.html