件名の説明:
$ $ N-操作基、各フォームXYPの動作を制御します。
場合の$ P $ 1、第変数$ X $と$ Yの$変数がYES、出力等しいこと、およびそれらの制限することができる場合は
等しいが、それ以外の場合、出力NO、および操作を無視します。
場合の$ P $ 0最初の変数$ X $と$ Yの$変数は等しくすることができる場合、出力YES、彼を制限
等しく、そうでない場合、出力NO、および操作を無視します。
アイデア:
互いに素セットと考えるのが自然である、等しい関係を維持参照してください。
しかし、等しいと不平等な関係を維持するために、この質問は、共通互いに素セットを満たすことができません。
どのようにした後にそれを行うには?診察室で、私は力の無知でした。その後、暴力のセットで発見され、各チェックが等しいことはできません保護し、誰がセット内に終了されるだろう。精神的に良いああ!私は本当にまだあまりにも料理。
合併対等な関係の時にセット内の要素の少ない数を見つけることが、彼は直接別のセットに挿入されます。このような暴力はヒューリスティックマージと呼ばれています。賢いけど役に立ちません
それだけで罰金に設定された不平等な関係に直接合流したとき。
コード:
#include <iostreamの> する#include <アルゴリズム> の#include <cstdioを> する#include <CStringの> する#include < セット > の#include <地図> 使用して 名前空間STDを、 セット < INT > S [ 2000005 ]。 設定 < 整数 > ::イテレータit。 マップ < int型、int型 > 。 INT [F 2000005 ]。 int型の検索(INT X){ 戻り F [X] == X X:F [X] = 検索(F [X]);} int型メイン() { // freopenは( "TrueFalse.in"、 "R"、STDIN)。 // freopenは( "TrueFalse.out"、 "W"、STDOUT)。 int型のn; scanf関数(" %のD "、&N) int型 I、CNT = 0 ; 用(i = 1 ; iが<= N * 2 iは++; ) [i]は、F = I。 用(i = 1 ; iが<= N; iは++ ) { int型X、Y。 scanf関数(" %dの%のD "、およびX&Y)。 [X](X = [X])?:CNT); [Y](yは[Y]を=):( Y = [Y] = ++?CNT)。 int型のOPT。 scanf関数(" %d個"、&OPT)。 int型のu = (x)を見つけます。 int型、V = 見つける(Y) もし(OPTの== 1 ) { もし、(S [U] .count(V)) プット(" NO " )。 そう であれば(U =!V) { もし、(S [U] .size()> S [V] .size()) スワップ(U、V)。 F [U] =V; 以下のために(これは、S = [U] .begin();!それ= sで[U] .END();それ++ ) { S [ * それ] .erase(U)。 S [ * それ] .insert(V)。 S [V] .insert( * IT)。 } プット(" YES " ); } 他の プット(" YES " ); } 他 { 場合(U == V) プット(" NO " )。 他 { S [U] .insert(V)。 S [V] .insert(U)。 プット(" YES " ); } } } }