239パリティゲーム互いに素セットをacwing

住所   https://www.acwing.com/problem/content/241/

小AとBは少しゲームをプレイしています。

まず、小S A書き込み0及び1からなる配列、長さがNです。

その後、小さなBは小さなM Aに問題を提示します

各質問では、2つの指定BのLとRの小さな数は、回答A小S [L〜R]は奇数または偶数を有します。

BはAの可能性が高い横たわっている小さな小さなウィットを発見しました。

例えば、小さなAは、S [1〜3]は、奇数番号1を有し、S [〜6 4]は1の偶数であり、今答えS [1〜6]が1の偶数を有する答えた、明らかにこれは自己であります矛盾します。

小さな少なくとも答えの一定数を横たわった後に決定することができることを注意して、このヘルプ小さなB Mの答えを確認してください。

すなわち、01そのような第一の配列が一つの答え1〜Kを満足するSが、1〜K + 1番目の回答を満たさないと、最小のkを得ます。

入力形式

最初の行は、N、01系列長を表す整数を含んでいます。

第二行は、それが質問の数を表す、整数Mを含んでいます。

S [L〜R]奇数を有するか、または偶数を記述するための2つの整数LとR、および「偶数」の答えまたは「奇数」:次のM行は、各行が質問と回答のセットを含みます。

出力フォーマット

出力整数k、01は、1〜Kを満たす最初の回答のシーケンスを表すが、回答を満たす場合に、すべての01の配列、問題の総出力数、1〜K + 1番目の回答を満たしていません。

レンジデータ
N≤ 10 ^ 9。、M≤ 10000 
入力サンプル:
10 
。5 
。1  2 3  。4 ODD
 5。 6。さえ
 1。 6。さえ
 7。 10 ODDの
出力サンプル:
3

解決策1:

加重互いに素セット

このトピックの2つの困難があります。 

データ10 ^ 9の広い範囲を持つ1 

2コンテンツが互いに素セットに変換する方法を尋ねます

問題解決方法1は、1234年に離散マッピング異なるデータを使用することです。のみ10,000尋ねるので、それぞれがとても長いデータが10000に2の範囲として、二つのデータを提供尋ねます*

和[L-1] - 2プレフィックスの範囲内であり、rは1であり、lが奇数、または偶数とプレフィックスを算出する総和[R]を提供する場合の問題を解決します

また、偶数保存保存偶数奇数奇数偶数最後奇数および外観の差が奇数であることにも効果の2つだけ異なるタイプであるため

だから、実際には、ばらばらのセットのパリティプレフィックスと各要素であり、

すべての重み付け要素の増加アレイは、プレフィックスであり、祖先に組み込まれ、Dが記録される[x]はx重み付けされたアレイ要素がルートのパリティと同じであるかどうかであります

二つの要素が共通の祖先の下にマージされている場合は時間が新しい問い合わせを取得するとき、あなたはそれらの類似点と相違点と類似点とその祖先の違い、彼らの類似点と相違点に基づいて、入力が復帰し、競合しない場合と同じであるかどうかを裁判官に来て得ることができます

コードは以下の通りです

1の#include <iostreamの>
 2の#include < ストリング >
 3の#include <unordered_map>
 4  
5  使用 名前空間STDを、
6  
7  CONST  INT MAX_M = 20010 8  
9  整数N、M。
10  整数N、M。
11  
12  INT FA [MAX_M]。
13  int型D [MAX_M]。
14  
15  INT IDX = 0 16  
17 unordered_map < INTINT > S。
18  
19  
20  // 离散化
21  int型 GETINT X){
 22      であれば(S.count(X)== 0)S [X] = ++ IDX。
23      リターンS [X]。
24  }
 25  
26  ボイドのinit()の
 27  {
 28      のためにINTは iは= 0 ; I <MAX_Mを、I ++ ){
 29          、FA [I] = I。
30      }
 31  }
 32  
33  int型の検索(int型X){
 34     もし(!FA [X] = X){
 35          のintルート= (FA [X])を見つけます。
36          D [X] + = D [FA [X]%2 37          FA [X] = 根。
38      }
 39  
40      リターンFA [X]。
41  }
 42  
43  
44  のint main()の
 45  {
 46      
47      CIN >> N >> M。
48      INT RES = M。
49      のinit();
50      のためにINT iが= 1 ; iが<= M; I ++ ){
51である         INT A、B、ストリングS;
 52である          CIN >> A >> B >> S;
 53れる          A = GET(A - 1); B = GET (B)
 54は         int型 PA =探す(A)、鉛= 検索(B);
 55  
56である         のiF(PA == Pb)の{
 57れる             // 前の二つの情報かどうかを確認し
58              IF(S == " 偶数" 59              {
 60                  // 両方とも同じパリティ有する
61である                 のiF((D [A] D + [B])%2!= 0 ){
62                      // 矛盾
63である                      RES = I - 1。;
 64                      BREAK ;
 65                  }
 66              }
 67               IF(S == " ODD " ){
 68                  // 二つの異なるパリティ
69                  IF((D [A] + D [ B])%2 =!1。){
 70                      // 矛盾
71は                      RES = I - 1。;
 72                      BREAK ;
 73である                 }
 74              }
 75             {
 76                  COUT << S << ENDL。
77                  COUT << " エラー" << ENDL。
78                  ブレーク;
79              }
 80          }
 81          {
 82              // PA = PB!
 83              // 合并
84              FA [PA = PB。
85              int型のアドオン= 0 ;
86              であれば(S == " 奇数")を追加= 1 87             D [PA] =(D [A] + D [B] + ADD)%2 88          }
 89  
90  
91      }
 92      COUT << RES << ENDL。
93  
94  
95  
96      戻り 0 ;
97 }
加重互いに素セット

 

おすすめ

転載: www.cnblogs.com/itdef/p/12115453.html