互いに素セット - フードチェーン

食物連鎖の
	
動物界動物Aの3種類、B、C、動物の食物連鎖の3つのタイプがあります面白い環を構成します。
食品Bは、BがCを食べ、C Aを食べます 
動物の前N、1-Nの数。
各動物は親切で、B、Cであるが、我々は最終的にはそれを知らないの種類です。
これは、N説明から成るこの栄養動物の2つのバージョンを用いて行った:
最初の引数は「1 XY」であり、それがXを表し、Yは類似しています。
第2引数は「2 XY」であり、XはYを食べる表します 
上記の二つの文を有するN個の動物のためのこの人は、文ずつの文はこの文、いくつかの真のいくつかの偽のK、Kを避けます。
以下の三つの言葉の一つ、この文は嘘である場合には、真実はそうです。
1)現在の真の場合、前の競合のいくつかは、嘘である; 
2)、次いで、現在のXまたはYがNよりも大きい場合、嘘である; 
3)Xは、現在のX、食べる表し、嘘です。
タスクは、N及びKの単語の総数、嘘の出力に応じて与えられます。
入力フォーマット
最初の二行のスペースで区切られた整数NおよびKです。
K次の3行はそれぞれ、Dは、引数の型を示す二つの数字の間のスペースで区切られた正整数D、X、Y、です。
D = 1の場合は、XとYが類似していることを示しています。
D = 2の場合、XはYを食べる表します 
出力フォーマット
嘘の数を表す唯一の整数。
データ範囲
1≤N≤500001≤N≤50000、
0≤K≤1000000≤K≤100000 
入力サンプル: 
1007
101 1 1
2 1 2 
2 3 2 
2 3 3 
。1 1 3 
2 3 1 
。1. 5 5 
出力サンプル:
3

  

書式#include <iostreamの> 

名前空間stdを使用。

const int型のN = 50010; 

N INT、M。
int型P [N]、D [N]。

INT(INT X){を見つける
    場合(!P [X] = X){ 
        int型、T =見つける(P [X])。
        D [X] + = D [Pの[X]]。
        P [X] = T。
    } 
    戻りP [X]。
} 

int型のmain(){ 
    scanf関数( "%D%dの"、&N、&M)。
    
    以下のために(INT i = 1; iが<= N; iは++)Pは[I] = I。
    
    int型のres = 0; 
    (M - )、一方{ 
        int型のT、X、Y。
        scanf関数( "%D%D%D"、&T、およびX&Y)。
        
        (X> N Yを||> N)RES ++場合。
        他{ 
            int型のPX = PY、(X)を見つける=(Y)を求めます。
            もし(T == 1){ 
                //
                IF(PX、PY == &&(D [X] - D [Y])%3)RES ++。
                他の(!PX = PY){もし
                    P [ピクセル] PY =。
                    D [PX] = D [Y] - D [X]。
                } 
            } 
            { 
                IF(PX、PY == &&(D [X] - D [Y] - 1)%3)RES ++。
                他の(!PX = PY){もし
                    P [ピクセル] PY =。
                    D [PX] = D [Y] - D [X]は、+ 1、
                } 
            } 
            
        } 
    } 
    のprintf( "%dの"、RES)。
    0を返します。
    
}

  

おすすめ

転載: www.cnblogs.com/luyuan-chen/p/11407116.html