早朝に部屋が温まるまで、テンプレートを平手打ちしたいと思います。
結果は....輝くステンド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を返します。 }