ポータル
問題解決のためのアイデア
重み付け互いに素セット:
加重互いに素セットとは何ですか?
これは、親の情報(体重など)への各ノードの記録です。
問題:ときに圧縮パスノードとルートの重みに父の変換の合計重量に本ノード
それはどのように変換しますか?
各質問には、同じ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