[NOI2001食物連鎖(1390スルーNOI情報)

説明[タイトル]

動物界A、B、Cの動物の3種類があり、動物の食物連鎖の3つのタイプが面白い環を構成します。食品Bは、BがCを食べ、C Aを食べます

動物の前N、1-Nの数。各動物は親切で、B、Cであるが、我々は最終的にはそれを知らないの種類です。

一部の人々は、この関係N 2種類の方法によって形成された動物の食物連鎖について説明します。

最初の引数が「1 X Y」であり、X及びYは類似している表します。

2番目の引数が「2 X Y」であり、XはYを食べる表します

上記の二つの文を有するN個の動物のためのこの人は、文ずつの文はこの文、いくつかの真のいくつかの偽のK、Kを避けます。以下の三つの言葉の一つ、この文は嘘である場合には、真実はそうです。

現在および以前の競合場合1)、その後、いくつかは実際に、それは嘘です。

2)Nより現在のX又はYより大きい場合、嘘です。

3)現在、X、Xは、嘘であると言って食べています。

あなたの仕事は総数(1≤N≤50,000)及びKワード(0≤K≤100,000)であり、出力は、所与のN.であります

[Enter]を

スペースで区切られた2つの整数N及びKの最初の行、。

K次の3行はそれぞれ、Dは、引数の型を示す二つの数字の間のスペースで区切られた正整数D、X、Y、です。

D = 1の場合は、XとYが類似していることを示しています。

D = 2の場合、XはYを食べる表します

[出力]

唯一の嘘の数を表す1つの整数。

[サンプル入力]

100 7 
1 101 1 
2 1 2 
2 2 3 
2 3 3 
1 1 3 
2 3 1 
1 5

[サンプル出力]

3


問題解決の多くを読み、このアプローチは最高の次に理解されていると結論付けました。

ほとんどの方法とは異なり、我々は大きなとしてのオープンスペースを3回セット互いに素。しかし、キーは何の表現の後に2回使用されています。ここで私は二つの概念、捕食者と獲物をご紹介します!xはその後、yのyは捕食者を食べることをx、Xの獲物をyとしましょう。1-N:我々は、それぞれ表す上記三回空間、誰のために、誰同じであるを表します。* N N + 1〜2:天敵のセットを表します。2 * N * N + 1-3:獲物の集合を表します。

だから、これは私たち戻って、両方の命令を見ています:

1. xとyを入力し、xとyは同じ種類を表します。xとyのために、彼らはすでに食べられて食べ物と関係を持っている場合は、嘘をつきます。だから我々は、xとy + N、Y + 2 * nは同じセット(Yか獲物またはXの捕食者)、そうであれば、ANS ++、そうでない場合は合併しているチェック。NATURALは、3組合わせマージしなければならない、すなわち合成: - XおよびY - X + Nであり、Y + N - X + 2 * Nであり、Y + 2 * n個

2. xとyを入力し、xがyを食べ表し:それは嘘がある場合は、この時点では、2つのケースがあります: - 1.xおよびyは同じクラスである - ×1を食べる2.y、我々は唯一のxに対する状況を確認する必要がありますコレクション内かどうかについてのy。2の場合には、我々は確認する必要があり、x + N yは、(x yが獲物ない)同じセットです。2つの条件が満たされていない場合は、それもアップエッジでしょう。三辺を接続する必要があります: - 1.Y + Nであり、X(yは獲物のXである) - 2.xの+ 2 * n、およびY(Yの捕食者であるX) - 3。これは最も独創的なものです(!): - X + N(x及び捕食者に対するYの餌食に)Y + 2 * nに - 本明細書の理解を容易にするために、動物のTに導入されてもよい - 捕食動物をTはX、環状構造であり、それは天敵Yでなければなりません右 - ので、X + N Y + 2 * nは、本質的にマージするために、クラスに属しています! - これは、この質問の魂である、我々はそれを塗った紙を取る方法がわからない、理解しなければなりません!

これらの関係を(私は少し周りだっ認める)を理解するために、この問題が実装するのは難しいことではありません。具体的な実装コード:

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  INT FA [ 20000001 ]、ANS。
4  int型リード()
 5  {
 6      int型、F = 1、X = 0チャー S = GETCHAR()。
7      一方(S < ' 0 ' || S> ' 9 '){ もし、(S == ' - ')、F = - 1 ; S = GETCHAR();}
 8      ながら(S> = ' 0' && sの<= ' 9 '){X = X * 10 + S- ' 0 ' ; S = GETCHAR();}
 9      X * = F。
10      リターンX。
11  }
 12  空隙書き込み(INT X)
 13  {
 14      であれば(X < 0 15      {
 16          のputchar(' - ' )。
17          X = - X。
18      }
 19      場合(X> 9)書き込み(X / 10);
20      のputchar(Xの%10 + ' 0 ' )。
21  }
 22  INT(見つけるINT X)
 23  {
 24を     場合(!FA [X] = X)FA [X] = (FAは[X])を見つけます。
25      リターンFA [X]。
26  }
 27  のint main()の
 28  {
 29      int型N、M、W、X、Y、K、D。
30      N =読み取る(); K = リード()。
31      のためにint型 i = 1 ; iが= < 3私は++; * N 32         FA [I] = I。
33      のためには、int型 i = 1 ; iは= Kを<Iは、++は34      {
 35          yは。=; D =()を読み出す; X =リード() )(読み取ります。
36          であれば(x == yの&& Dの== 2 37          {
 38の              ANS ++。続け;
39          }
 40          場合(X> N || Y> N)
 41          {
 42の              ANS ++。続け;
43          }
 44          であれば(Dの== 1 45         {
 46              場合には、((X)==検索(Y + n)を見つける||(X)==検索(Y +見つける2)* n)を++ ANS 47              他の
48              {
 49                  FAは、[(y)を検索] = (X)を見つけます。
50                  FA [検索(Y + N)] =を見つける(X + N)。
51の                  FAは、[検索(Y + 2 * n)で] =(X +見つける2 *のN)。
52              }
 53          }
 54          であれば(Dの== 2 55          {
 56              であれば(見つける(X)==(Y)を見つける||(X + n)を見つける== Y +(見つける||(y)を見つける2 * n)で==検索(x))をANS ++;
57              他の
58              {
 59                  FA [(Y + N)を見つける] = (X)を求めます。
60の                  FA [見つける(Y)] =(X +見つける2 *のN)を、
61の                  FAは、[検索(Y + 2 * n)で] =(X +見つけるN)。
62              }
 63          }
 64      }
 65      ライト(ANS)。
66      リターン 0 ;
67 }

//参考:羅区・P2024の食物連鎖(多基準互いに素セット) - Guess_Haさんのブログ- CSDNブログ
https://blog.csdn.net/qq_39553725/article/details/76474124

おすすめ

転載: www.cnblogs.com/ljy-endl/p/11277606.html