MZOJ第80位Hzwer隕石

分析

天の川英雄伝説のようにずっとありますか?

さてなし

問題は同じではありませんが、新しい名前

問題を見て:現在の時刻において、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(トランス、0sizeof (トランス));
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 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/Mandy-H-Y/p/11454938.html