タイトル説明
述べたように、互いに素セットは、今そこにある、あなたがマージし、クエリ操作を完了する必要があります。
入力形式
最初の行は、2つの整数N、Mを含み、NはMの要素と操作の合計を表します。
次のM行、三つの整数紫、西、李を含む各行
場合紫= 1、Xi及び李の合成組
紫= 2の場合、Xi及びYiが同じセット内にある出力は、Y出力場合であり、それ以外の場合は、Nを出力します
出力フォーマット
上記のように、紫= 2のそれぞれのための動作は、出力線を有し、各列は、大文字が含まれているか、またはYはNであります
サンプル入力と出力
入力#1
4 7 2 1 2 1 1 2 2 1 2 1 3 4 2 1 4 1 2 3 2 1 4
出力#1
N Y N Y
説明/ヒント
時間の制約:1000ミリ秒、128M
データスケール:
データの30%、N <= 10、M <= 20。
データの70%を、N <= 100、M <= 1000。
データの100%に、N <= 10000、M <= 200000。
特別な注意:FA配列を初期化する必要があり、すべてのノードの祖先は、自分のしています
ACコードとテンプレート
#include <iostreamの> 使用して 名前空間STD; のconst int型 NN = 1E6 + 10 ; INT N、M; int型FA [NN]を、 INT(検索INT X){ // クエリと圧縮パス IF!(X = FA [X] ) FA [X] = (FA [X]を見つける。); 戻りFA [X]を; } 無効に参加(int型のx、int型の Y){ // ここで、yが設定合わせXを int型 FY、FXは=(X)を探します= 検索(Y); IF(FX =!FY) FA [FX] =FY; } int型のmain(){ CIN >> N >> M; のための(INT I = 1 ; Iは= Nを<; Iは++)FA [I] = I; // 各ノードは、自身の祖先である初期化 int型OP 、T1、T2、 一方(M-- ){ scanfの(" %D%D%D "、&OP&T1、およびT2)、 IF(OPは== 1 ){ 参加(T1、T2); // マージ } 他の{ のiF(検索(T1)==検索(T2)){ // クエリが同じ祖先である COUT << " Yは、" << ENDL; } 他{ COUT << " N " << ENDL; } } } }