食物連鎖の 動物界動物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を返します。 }