質問は、表面:
タイトル説明
動物界A、B、Cの動物の3種類があり、動物の食物連鎖の3つのタイプが面白い環を構成します。食品B、B
C、CはAを食べます
動物の前N、1 - のID N. 各動物は親切で、B、Cですが、私たちは知りません
これは最終的にどれ。
一部の人々は、この関係N 2種類の方法によって形成された動物の食物連鎖について説明します。
最初の引数が「1 XY」であり、X及びYは類似している表します。
第2引数は「2 XY」であり、XはYを食べる表します
上記の二つの文を有するN個の動物のためのこの人は、文によって、一つの文章は、いくつかの真の文K、Kを避けます
、いくつかの偽。以下の三つの言葉の一つ、この文は嘘である場合には、真実はそうです。
•以前の競合のいくつかの本当の言葉で、現在の場合は、嘘です
•Nよりも、現在のXまたはYより大きい場合、それは嘘です
•現在は嘘で、X Xを言うように食べます
タスクは、N及びKの単語の総数、嘘の出力に応じて与えられます。
入力形式
eat.inからの入力データ
二つの整数の最初の行、N、K、N、動物、Kワードを発現しました。
各ワードは、(被写体の要件に従って、実施例を参照)は、第2のラインをライン
出力フォーマット
eat.outで出力
ライン、嘘の合計数を表す整数。
この質問は非常に単純なだけのロジックを明確にすることです
Xは前にYであれば1で、XとYは、似ている捕食者や獲物のXは、Yが保持していないです
設立された場合は、XとYが同じで、XがY獲物獲物で、捕食者XがYの捕食者であります
XとYは同一またはXであれば2時に、X Yを(XがYの天敵である)を食べ、天敵はYように設定されていない前に、
設立された場合は、XがYの捕食者である、獲物のXがYであり、Xは、獲物Yの捕食者であります
XまたはYが限界を超えるので、コードは非常に容易である。さらに、容易にそこケース嘘で得られます
書式#include <アルゴリズム> 書式#include <iostreamの> の#include <iomanip> 書式#include <CStringの> の#include <cstdioを> する#include <cmath> の#include <キュー> std名前空間を使用しました。 INTのN、K、ANS = 0; int型のF [1500005]; // F [i]がI本身、iは、猎物的[iがnを+] fをF [I + 2 * n]はI的天敌 INT GF(INT X ) { IF(F [X] == x)をリターンX。 F [X] = GF(F [X])。 [x]はfを返します。 } ボイド連合(int型のx、int型のY) { int型F1 = GF(X)、F2 = GF(Y)。 (F1 = F2!)もしF [F1] = F2; } //合并 INTメイン() { scanf関数( "%D%dの"、&N&K)。 以下のために(INT i = 1; iが<= N * 3; iは++)F [I] = I。 (I 1 = int型のために、私は= Kを<。 scanf関数( "%D%D%D"、およびBJ&XX&YY); IF(XX> N- || YY> N-){ANS ++;続行;} //限界を超えたか否かを判断する 場合には(BJ == 1) { IF (GF(XX + N)== GF(YY)|| GF(XX + 2 * N)== GF(YY)){ANS ++;続ける;} // XがYまたはXがYの捕食捕食され 連合(XX、YY); // X及びYは、同一である ユニオン(XX + N、YY + N); // X Yの獲物は獲物である 連合(XX + 2 * N、 YY + 2 * N); // XはYの捕食者の捕食者である } (BJ == 2)IF他 { IF(GF(XX)== GF(YY)|| GF(2 * N-XX +)== GF(YY)){ANS ++;続行します;} // X及びY同じまたは天敵X Yである 連合(XX、YYの* + N-2); // XはYの捕食者である 連合(XX + N、YY) ; // XはYの獲物である 連合(XX + 2 * N、YY + N); // X Yの捕食者が捕食される } } のprintf( "%d個の\ N-"、ANS)。 0を返します。 }