F - ドラゴンボール

五百年後、ドラゴンボールの数が予想外に増加しますので、猿王(悟空)が一緒にドラゴンボールのすべてを収集することは非常に困難です。 

彼の国では、N個の都市を持っており、世界でもNドラゴンボールはまさにそこにあります。まず、i番目のドラゴンボールのために、神聖なドラゴンの意志は、i番目の都市でそれを置きます。長い年月を経て、いくつかの都市のドラゴンボール(S)は、他の都市に輸送されるだろう。物理的強度を保存するには悟空ドラゴンボールを収集するためにフライングニンバス雲、魔法の飛行雲を取ることを計画しています。 
悟空が1つのドラゴンボールの情報を収集するたびに、彼はあなたにそのボールの情報を聞いてきます。あなたはボールが配置されている都市を彼に伝える必要がありますし、どのように多くのドラゴンボールがその都市であり、あなたもボールがこれまでに搬送された回数を彼に伝える必要があります。

入力のInputThe最初の行は、単一の正の整数T(0 <T <= 100)です。 
N及びQ(2 <N <= 10000、2 <Q <= 10000):それぞれの場合について、最初の行は、2つの整数を含んでいます。 
以下のQラインの各々は以下のフォーマットとして事実や質問のいずれかを含む: 
  TABを:Aと同じ都市にあるすべてのドラゴンボールがでB番目ボール都市に輸送されている次の2つの都市と仮定することができます。異なっています。 
  QA:悟空はX(都市アトボールのIDである)、YとZ(ATHボールのtranporting回)(X番目の都市でボールのカウントを)知ってほしいです。(1 <= A、B <= N)OutputFor各テストケースは、出力サンプル出力としてフォーマットさテストケース番号。次に各クエリ、出力のための3つの整数値XYZを持つ行が空白space.Sample入力によるsaparated

2 
3 3 
T 1 2 
T 3 2 
Q 2 
3 4 
T 1 2 
Q 1 
、T 1 3 
Q 1

サンプル出力

1ケース:
2 3 0 
ケース2:
2 2 1 
3 3 2。
互いに素なセット右と
// この質問は真珠の街を離れて移動したときに、この街は無用です,,,ピットを感じている、パールに対して何ら動きは存在しません
 // TAB(AとBはドラゴンボールです)ので、パールインデックスのルートノードは、彼の都市に対応して、
 // そのルートうまくなるように1つの都市を見つける私たちはドラゴンボールを必要とする場合。パールの都市の数を求めて、
 // このツリーのルートに子ノードの数を見つけることが(と彼が考えられている)以上のもの。主な需要はドラゴンボールの動きの数です。
// 我々は、我々はこれらの二つの真珠のルートノードを接続する2つのパールを接続する場合は0に初期化されたレコードの配列を、開け
 // し、我々は、ルート移動させ、その後、上のルートノードを聞かせてそのモバイルノード,,, ,,。
#include <cstdioを> 
する#include <CStringの>
 使用して 名前空間STD;
 のconst  int型 N = 1E5 + 7。;
 int型 ; FA [N]を// 親ノードレコード
INT息子[N]を; // サイズツリー記録
int型 RAN [N]を。// 移動のレコード番号
INT(検索INT X){
     IF(X == FA [X])
         を返すFA [X];
     {
         int型 K = FA [X]; 
        FA [X] = (FA [X])を検索するステップと、
        RAN [X] RAN = + [K]; //は、これは主に、ルートノードの移動を送信するために使用されます。
        戻るFA [X]; 
    } 
} 

無効に参加(int型の Xを、int型Yを){
     int型(X)= FXを見つけ、FYは= ;(Y)の検索
     IF(!FX = FY){ 
        FA [FX] = FY; 
        息子[ FY] + = ソン[FX]。
        RAN [FX] ++; // 移動ルートをさせ
    } 
} 
// 初期
空隙 inint(INT X){ 
    memsetの(RAN、0はsizeof (RAN));
     のためのINT I = 1 ; Iは、= Xを<。 ++ I ){ 
        FA [I] = I; 
        息子[I] = 1 ; 
    } 
} 
int型のmain(){
     int型の T、KK = 0 ; 
    scanfの(" %のD "、&T)、
     一方(T-- ){
        株式会社 ++ 
        のprintf(" ケース%D:\ nを" 、(株));
        INTのN、M。
        scanf関数(" %d個の%のD "、&​​N、&M)。
        inint(N)
        以下のためにint型 iは= 1 ; iが<= M; iは++ ){
             char型 [ 10 ]。
            scanf関数(" %sの" 、A)。
            もし([ 0 ] == ' T ' ){
                 int型X、Y。
                scanf関数(" %D%D "、&​​X、&
                (x、y)が参加。
            } 
            そう であれば([ 0 ] == ' Q ' ){
                 int型のZ。
                scanf関数(" %のD "、&Z)。
                INT、M = (z)を見つけます。
                printf(" %D%D%D \ n " 、M、息子[m]は、[Z] RAN)。
            } 
        } 
    } 
    戻り 0 
}

 



おすすめ

転載: www.cnblogs.com/Accepting/p/11306384.html