トピックへのリンク:http://cogs.pro:8081/cogs/problem/problem.php?pid=pxNJzxVPU
タイトル3匹、AはB、BがCを食べて食べて、Cを食べます
Bである食品、AはこれにB天敵である、と。
したがって3の組が存在してもよい、0-Nは、捕食者を表し動物、NN + Nは、それらの食糧、N + NN * 3を表すことを意味します。
コードは以下の通りであります:
#define _CRT_SECURE_NO_WARNINGS の#include <iostreamの> する#include <cstdioを> の#define MAXN 50100 使用して 名前空間STD; INT N、K、D、X、Y、 INT ANS = 0 ; int型のプレ[* MAXN 。3 ]; // n型種であります食品N + N、N * 3つの天敵は、 int型(検索INT X) { IF(X == [X] PRE) のリターン; Xを 返す事前[X]を= (予備[X])を検索 } ボイド連合(INTを X-、INTY) { 事前[(X)検索] = (y)を見つけます。 } int型のmain() { freopenは(" eat.in "、" R " 、STDIN)。 freopenは(" eat.out "、" W " 、STDOUT)。 scanf関数(" %d個の%のD "、&N&K)。 以下のために(int型 iは= 0 ; iがN * < 3 ; iは++ ) 事前[I] = I。 一方、(K-- ) { scanf関数(" %D%D%D "、D&&X&Y)、 IF(X> N || Y> N) ANS ++ ; 他 { IF(D == 1 ) { // 食品をx捕食者のxまたはyがyは IF(検索(X + N)==検索||(y)を探す(N * X + 2)== 検索(Y)) { ANS ++ ; 続行; } そう // XYその種類は、XY食べ物が似ている、XYの捕食者は似ています { 連合(X、Y); ユニオン(X + N、Y + N); ユニオン(X +(N << 1。 )、Y +(N << 1 )); } } 他 { IF(X == Y | |検索(X)==)(Y + N)検索==(x)の検索||(y)を見つけ // xとyは、食品グレードで { ANS ++ ; 続行; } 他 // xとy同様の捕食者、xおよびyは同じ食品であり、xとyの捕食者は、食品グレードである { 連合の(X、Yと +(N << 1)); 連合(X + N、Y); 連合(X +(N << 1)、Y + N)。 } } } } のprintf(" %d個の\ n " 、ANS)。 リターン 0 ; }