羅バレーP2024 [NOI2001]食物連鎖(タイプ互いに素なセット重み付け互いに素なセット)基

ポータル


問題解決のためのアイデア

重み付け互いに素セット:

加重互いに素セットとは何ですか?

これは、親の情報(体重など)への各ノードの記録です。

問題:ときに圧縮パスノードとルートの重みに父の変換の合計重量に本ノード

それはどのように変換しますか?

各質問には、同じQAQではありません

我々は、[x]は、xは2に等しく、1×Fに等しい食べ、この質問R [X] = 0 [X]は、X及びFによって表される同一の種を見するF [x]は、食物を表します。

点xからFへの[X]の祖先の重量の点Iに重みを更新する方法です。

圧縮パスがF実際のリターンにので、再帰的であるため、[X] =とき、F [X] [F]([X] F)を見つけるの祖先です。

これは、実際のマップです。

次いで、これをR [X] =(R [X] + R [X] [F])%3を見つけることは困難ではない、問題に配置されています。

証拠のない大胆な推測!

その後、合併は次のとおりです。

それを最初の場所を把握!F1はAの先祖であり、F2は、Bの祖先であります

A及びBは、(祖先の祖先Bとして父親)マージされ、本質的に[F1] Rが必要です。

xは知られている - AとBが同じである場合、XがBを食べるとき、0であり、xは1です。

そう明らかに、R [F1] =(R [B] + XR [A] +3)%3。(負があるかもしれないので、それが+ 3%3です)

証拠のない大胆な推測!


互いに素セットの種類:

-互いに素セットの種類を理解していませんが、比較的単純な問題この道を見下ろすことができギャング

この質問を見て、ばらばらのセットのようなものを知っている:3を同じ互いに素セットで別々に維持されている、食品、捕食者(配列F開口部--1〜N、N + 1〜2 * nの3倍の大きさ、 N * 2 + 1〜3 * n)で。

各時間データのための -

  • 1時:天敵bまたはbが自然ANS ++の敵、または合併であるかどうかを確認する(、bは類似したのと同じ種類である、食品が食品bである、自然の敵は、Bの天敵です)
  • とき2:aとbが同じかANS ++の天敵B、または合併されているかどうかを確認する(食べ物がbは、bが同様の天敵、食品bの天敵です)

最終的な出力への答え。

//比較的単純な書き込みをしない、シンプルだと思い、何の困難な課題CKW --by

ACコード

重み付け互いに素セット:

1の#include <iostreamの>
 2の#include <cstdioを>
 3  使用して 名前空間STDを、
4  CONST  INT MAXN = 50005 5  int型N、K、F [MAXN]、R [MAXN]、ANS。
6  INTの検索(INT X){
 7      であれば(F [X] == x)をリターンX。
8      int型の FA = 検索(F [X])。
9      R [X] =(R [X] + R [F [X]])%3 10      F [X] = FA。
11の     リターンFA;
12  }
 13  のint main()の
14  {
 15      CIN >> N >> K。
16      のためにint型 i = 1 ; iが<= N; iが++ ){
 17          F [I] = I。
18      }
 19      ながら(k-- ){
 20          int型A、B、C。
21          のscanf(" %D%D%D "、&​​C、&、&B)。
22          であれば((Cの== 2 && == b)は|| A> N || B> N){
 23の              ANS ++ 24              続け;
25          }
 26          int型 FX =(A)を見つけます。
27          INT FY = (B)を見つけます。
28          もし(C == 1 ){
 29              であれば(FX == FY && R [A] =!R [B]){
 30の                  ANS ++ 31                  続け;
32              }
 33              であれば(FX =!年度){
 34                  F [FX] = FY。
35                  R [FX] =(3 + R [B] -r [A])%3 36              }
 37              続けます38          }
 39          であれば(Cの== 2){
 40              であれば(FX == FY &&(R [A] + 3 -r [B])%3 =!1 ){
 41の                  ANS ++ 42                  続け;
43              }
 44              であれば(FX =!年度){
 45                  F [FX] = FY。
46                  R [FX] =(3 + R [B] -r [A] + 1)%3 47              }
 48          }
 49      }
 50      COUT << ANS。
51      リターン 0 52 }
重み付け互いに素セット

互いに素セットの種類(プレス行大法が良いです!):

1の#include <iostreamの>
 2の#include <cstdioを>
 3  使用して 名前空間STDを、
4  CONST  INT MAXN = 50005 5  int型 N、K、F [MAXN * 3 ]、ANS。
6  INTの検索(INT X){ リターン F [X] == X X:F [X] = 検索(F [X]);}
 7  のint main()の
 8  {
 9      CIN >> N >> K。
10      のためには、int型 i = 1 ; iが= < 3 * N; iが++ ){
 11          Fを[I] =私;
12      }
 13      ながら(k-- ){
 14          int型A、B、C。
15          のscanf(" %D%D%D "、&​​C、&、&B)。
16          なら ANS ++ {(> N || B> N)。引き続き;}
 17          場合(C == 1)()+ N(見つける==検索(B)||見つける(B + N)==検索(A))(ANS ++):( F [見つける(A? )] = [()+ nを見つけるF、(b)は、検索] =(B + N)を見つけ、(A + N *見つける[F 2)] =(B + N *見つける2 ))と、
18          ?(ANS ++):( F(== bは(A)==検索(B)||(A)==検索(B + n)を見つける見つける||)([(A)検索] =見つけますB + 2 * n)で、[(+ nを見つける。)] = F(B)、[(A +見つけるfを見つける2)×n個] =(B +見つけますN))。
19      }
 20      COUT << 年。
21      リターン 0 22 }
互いに素セットの種類

// NOI2001 1日目のT1

おすすめ

転載: www.cnblogs.com/yinyuqin/p/11774582.html