コアソリューション(互いに素セット):
虎、食品、トラの捕食者:動物は以下の3種類があると仮定します。問題解決で見られることを意図している。明確にどのようにこれらの関係の理由への鍵。XYは、これらの3つのタイプ(裁判官の関係への入力m回)は、xyは未知の二つの別々の動物種(すなわち、虎の体、食べ物や捕食者を知っていない)でのみ満たすに入りました。今、私たちは、ビルドに必要な、我々は互いに素セットを使用する必要があるので、個人間の関係を照会したが、両者の関係の維持から互いに素セットは3との間の関係を維持します。テンプレート互いに素セットはまだ適用され、直接設定されますが、要素の数nによって3Nに初期化時にすることができます。その理由は、以下のようにされています。以前はグループのみかどうかの質問にだけではなく、裁判官から、それはn個の同じセットに設定することができますが、ここではこれら3つのグループボディ、食品、天敵があるかどうかを判断する必要があります。
ストレージを容易にするため、二重の預金自体、キープ食品2回、3回、預金捕食者;しかし、我々は、に注意を払う必要があります:捕食者の捕食者を食べるために自分の食べ物を食べることができます。
実装コード:
1つの#include <ビット/ STDC ++ H.> 2の#include <CStringの> 3。 使用した 名前空間STD; 4 5。 の#define MAX_N 500 005 6。 INT N-、M、K; 7 INTランク[MAX_N]; // ツリーの高さ 。8 INT PAR 【MAX_N]; 9 INT ANS = 0 ; // 番号嘘記録 10 INT Tを[MAX_N]、X- [MAX_N]、Y [MAX_N]; 11 ボイドのinit(){ 12である ため(INT I = 1 ; I <= 3N- *; I ++ ){ 13は PAR [I] = I; 14 ランク[I] = 0 ; 15 } 16 } 17 18である INT検索(INT X){ // クエリツリールート 。19 IF(PAR [X] == X){ 20は、 リターン; X 21は } そう リターン PAR [X] =検索(PAR [X]); // 実際に直接検索処理における親ノードに接続されたルートノードに最適化されて 22である } 23が 24 ボイドユナイト(INT X、INT Y){ 25 X =(X)を求める; 26は、 Y = (Y)を求める; 27 28 IF(X == Y) のリターン; 29 30 IF(ランク[X] < ランク[Y]){ 31は PAR [X] = Y; 32 } さもなければ{ 33は PAR [Y] = であり; X 34は IF(ランク[X] ==ランク[Y])ランク[X] ++; // 2つのツリーの高などの時間、ツリーがx高さに合わせたプラス1 X 35 } 36 } 37 38は、 BOOL、同じ(INT X、INT Y){ 39 リターン検索(X)==(y)を見つけます。 40 } 41 42 INT メイン(){ 43 CIN >> N >> M。 44 のために(INT iは= 1 ; iが<= M; I ++ ){ 45 CIN >> T [i]を>> X [I]を>> Y [i]は、 46 } 47 のinit(); 48 49 のために(INT iは= 1 ; iが<= M; I ++ ){ 50 のint T = T [i]は、X = X [i]は、Yは= Y [i]が。 51 52 であれば(X < 1 || x> N || Y < 1 || Y> N){ // 先判断边界(满足条件2) 53である ANS ++ ; 54であり 続ける ; //は、参照する次の文スキップ 55 } 56である 57れる IF(T == 1){ // XYグレード表し 58 IF(同じ(X、Y + N-)||同じ(X、Y +を2 * N-)){ // xはxまたはyが捕食者(xyは異なるクラスの2匹の動物を表す)、明らかに嘘(のY捕食された場合に 59 ANS ++ ; 60 続け、 61である } 他 { // 以下でありますタイガー(バルク)の観点から、表示 62である ユナイト(X、Y); //本体と本体のでマージする、タイプのものである 63である ユナイト(X + N - 、Y + N-); // 食品及び食品タイプ(すなわち、X食品をy食品である)である 64 ユナイト(X + 2 * N-、 + Y 2 * N-); // 捕食者および天敵(すなわち、Xの種類は、捕食者yの天敵である) 65 } 66 } 他 IF(T == 2){ //は食べX yを表す(すなわち、yがxと場合食品関係) 67 IF(x == y)は{ // のx == yの表現が同じ動物であるが、少し速度書き込む必要がない場合は 68 ANSを++ ; 69 続行; 70 } 71 IF(同じ(X、Y)||同じ(X + 2 * N-、Y)){ //はX動物を表し、yは、動物の同じタイプ(本体が実行すると仮定される)は、XまたはYは、天敵(すなわちY食べるありますx)は、これが嘘であることを示している 72 ANS ++ ; 73で 続行し、 74 } 他{ 75 ユナイト(X +、N-、Y)を; // 食品およびyは同じ型のX 76 ユナイト(X + 2 * N-、Y + N-)を; / / yにxの捕食者は、食品の同じタイプである 77 ユナイト(X、Y + 2 ; * N-) // 同じタイプの捕食者XおよびY 78 } 79 } 80 } 81 coutの<< ANS; 82 リターン 0 ; 83 }