レース互いに素設定問題のテンプレート分析----- P2024 [NOI2001]食物連鎖

このリファレンスへ:問題の羅区p2024ソリューション

タイトル説明

動物界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で出力

ライン、嘘の合計数を表す整数。

サンプル入力と出力

入力#1
100 7 
1 101 1 
2 1 2 
2 2 3 
2 3 3 
1 1 3 
2 3 1 
1 5
出力#1
3

説明/ヒント

1≤N 5 * 10 ^ 4≤

1≤K≤10 ^ 5

 

まず、本当に彼はおそらく3つのレースに分割すると思ったが、維持する方法を知らないことをイライラ、このような問題が発生しました。神が問題にロス・ソリューションに大きな谷を見たとき、本当に身の引き締まる思い。互いに素セットとオリジナルの三回は簡単に、このような民族間の関係の維持の当面の問題を解決することができます。

この質問は、使用するために、このような民族間の関係のテンプレートとして使用することができます

おそらく思考:三回預金捕食者、二回獲物を維持し、レースで預金を倍増。定義された検索(x)はxの祖先について

1  // X、Y同じレース、レース、レース、X、Y獲物同じ人種、X、Y捕食同じレースと同じ場合は
2  (x、y)を参加
 。3参加(X + N - 、Y + N-)
 。4参加(X + 2 * N-、Y + 2 * N-) 
 。5  
。6検索(X)==検索(Y)// XY同じレース
7検索(+ N-X)==(Y)を検索// YはXの獲物です、すなわち、X Yの関係を食べる
。8検索(X + 2 * N-)==(Y)の検索// すなわち、X、X獲物yを、摂食の間のYの関係を

 

 

ACコード

#include <ビット/ STDC ++ H.>
 使用して 名前空間STD;
 のconst  int型 NN = 5E4 + 10 ; 

INT N-、M;
 INT [ 3。 * NN]; 


int型(検索INT X){ // 共通の祖先を見つける
    IF(X! = A [X])
        A [X] = ([X]を見つける。);
     戻り、[X]を
} 
無効参加(int型 X、INT Y){ // 複合セット
    のint(X)、FY =検索= FXを検索(Y); 
     IF(FX =!{年度) 
        A [FX] = FY; 
    } 
} 


int型のmain(){ 
    CIN >> N- M;
     のためのINT I = 1 ; I <= 3。 A [I] = I; * N- I ++)// 互いに素なセット操作初期化前に
    INT 、T、X、Y
     INT coun- = 0 ; // エラーの数
    一方(M-- ){ 
        scanfの(" %D%D%D "、T&&X&Y)、
         IF(X> N- Y ||> N-){ // エラー状態 
            coun- ++ ;
             続行; 
        }
         IF(T == 1 ){
             IF(検索(N-Xの+)==検索||(y)を探す(X + 2 * N-)==検索(Y)){ // X及びY珍しいレース関係が 
                ++ coun- ;                 
            } そうでなければ{ 
                (x、y)の参加、参加(X + N - 、Y + N-)、参加(X + 2 * N-、Y + 2 * N-); // Xをさせ、共民族Y、X、Y獲物同じ人種、 X、Y捕食同じレース
            } 
        } {
             IF(X == Y){ // エラー状態 
                ++ coun- ; 
            } そう IF(==検索||)(Yを探す(X)を探す(X +2 * N-)==検索(Y)){ // 非X食べるyの関係 
                coun- ++ ; 
            } そうでなければ{ 
                参加(X + N-、Y);参加(X + 2 * N-、Y + N-)、(Xに参加し、 + Y 2 * N-); // 誰関係食べる
            } 
        } 
    } 
    COUT << coun- << ENDL;
     戻り 0 ; 
}

 

 

おすすめ

転載: www.cnblogs.com/bigbrox/p/11311704.html