分析
天の川英雄伝説のようにずっとありますか?
さてなし
問題は同じではありませんが、新しい名前
問題を見て:現在の時刻において、iは領域Xを隕石数は、総面積の隕石番号y、およびiは隕石のZ搬送される回数をxは。
これ、およびマージメンテナンスのようにばらばらセットを見つける、木のDPを偽装することと等価です
この文ことに注意してください:
まず、父親の息子に更新した後に更新する必要があります
しかし、父親の値を更新しません
重複を避けるために、父はルートアップデートでないときことを確実にするために、(携帯電話番号を更新)主にトランスプラス
コード
1 / * ************************************************************ 2 ユーザー:Mandy.HY 。3 言語:C ++ 4。 問題:MZOJ Hzwer#80 5。 アルゴリズム: 6 **** ****************** * / 7 // 銀河英雄?? 。8の#include <ビット/ STDC ++ H.> 9。 10 使用 名前空間STD; 11 12であり、 CONST INT MAXN = + 1E4 5。 、 13は 14 INT T; 15 int型N-、Q; 16 INT 父[MAXN]; 17 INT[MAXN]トランス。 18 int型CNT [MAXN]、POS [MAXN]。 19 20テンプレート< クラス T>インラインボイド読み取る(T&X){ 21 、X = 0。ブールフラグ= 0。チャー CH = GETCHAR()。 22 しばらく(!isdigit(CH))旗| = CH == ' - '、CH = getchar関数(); 23 一方(isdigit(CH))X =(X << 1)+(X << 3)+(CH ^ 48)、CH = GETCHAR()。 24 であれば(フラグ)X = -バツ; 25 } 26 27テンプレート< クラス T> ボイド putch(CONST T x)から{ 28 であれば(X> 9)putch(X / 10 )。 29 のputchar(X%の10 | 48 )。 30 } 31 32テンプレート< クラス T> ボイド PUT(CONST T X){ 33 であれば(X < 0)のputchar(' - ')、putch( - X)。 34 他putch(X)。 35 } 36 37 空隙ファイル(){ 38 freopenは(" 80.in "、" R " 、STDIN)。 39 // freopenは( "80.out"、 "W"、STDOUT)。 40 } 41 42 ボイドのinit(){ 43 のための(int型 i = 1 ; iは= N <; ++ I){ 44 父[I] = I; POS [I] = I。 45 CNT [I] = 1 。 46 } 47 のmemset(トランス、0、sizeof (トランス)); 48 } 49 50 int型の検索(INT X){ 51 であれば(父[X] == x)をリターンX。 52 他{ 53 int型 FX = (父親は[X])を見つけます。 54 もし(父[父[X]] =!父[X]) 55 トランス[X] + = トランス[父[X]]; 56 父[X] = FX。 57台の POS [X] = POS [父[X]]。 58 リターン父[X]; 59 } 60 } 61 62 空隙マージ(int型のx、int型のY){ 63 int型の FXは=(X)、FY =見つける見つける(y)を、 64 父[FX] = FY。 65 CNT [FY] + = CNT [FX]。 66 CNT [FXは] = 0 ; POS [FX] = POS [FY]。 67の トランス[FX] ++ ; 68 } 69 70 空隙ワーク(){ 71 リード(N);(q)を読み取ります。 72 のinit(); 73 のために(int型 I = 1 ; I <= Q; ++ i)が{ 74 チャー C = GETCHAR()。 75 ながら(!C = ' T '!&& C = ' Q ')C = GETCHAR()。 76 もし(C == ' T ' ){ 77 、INT X、Y。 78 リード(X)、(Y)を読み出します。 79 マージ(X、Y) 80 } 他{ 81 のint J。 82 リード(J)。 83 int型 FX = 見つける。(J) 84 int型のx =POS [FX]。 85 int型、Y = CNT [FX]。 86 int型、Z = トランス[J]。 87 PUT(x)は;のputchar(' ' ); 88 プット(Y);のputchar(' ' ); 89 プット(Z);のputchar(' \ nを' ); 90 } 91 } 92 } 93 94 INT メイン(){ 95 // ファイル()。 96 リード(T); 97 のための(int型 I = 1;私は= tを<。++ I){ 98 のprintf(" ケース%のD:\ n " 、I)。 99 ワーク()。 100 } 101 戻り 0 ; 102 }