トピックへのリンク:http://poj.org/problem?id=1703
トピック効果:個々のnは、m回に尋ねます。代表的には、bとの関係を求め、Bの代わりに、所与のDは、異なるギャングに属します。
私の考え:
あまりにも料理、クラスはこのアプローチを期待していませんでした。
アイデア:
1.それは、所与のD Aに対して、Bが2人の異なるギャングに属し、2-SATのようだと思いました。私たちは、Bの反対ポイント通信でも、セット内に維持反対素集合データ構造で点bを使用します。
2. 場合、クエリは、Bは、2つの予備の値に等しい同じギャングに属します。点AとBが同じセットに属するポイントに同じ反対のセット、またはbの反対に属している場合は、aとbは異なるギャングです。上記は、その後、保持していない場合の関係は不明です。
3.反対点は架空である、オリジナルのポイントに影響を与えることができません。したがって、データ範囲倍、X +代表点xをN-は、対向します。
注意:あなたは、入力cinを時間を使用することはできません。scanf関数のみを使用します
1つの#include <stdio.hの> 2 のconst int型 MAXN = 2E5 + 1E4。 3 4 int型のプレ[MAXN]。 5 6 int型の検索(INT X) 7 { 8 であれば(PRE [X] == X) 9 リターンX。 10 他の 11 { 12 のintルート= 見つける(予備[X])。 13の プレ[X] = 根。 14 リターンプレ[X]。 15 } 16 } 17 18 INT メイン() 19 { 20 INT T。 21 のscanf(" %dの"、&T)。 22 一方、(T - ) 23 { 24 int型N、M。 25 のscanf(" %D%dの"、&N、&M)。 26 GETCHAR()。 27 のために(int型 i = 1 ; iが= < 2 * N; iが++ ) 28 { 29 プレ[I] = I。 30 } 31 用(int型 I = 1 ; I <= M; iが++ ) 32 { 33 チャーCH。 34 int型A、B。 35 のscanf(" %のC%D%D "、およびCH、&、&B)。 36 もし(CH == ' D ' ) 37 { 38 intは、X =検索(a)は、Y = (B)を見つけます。 39 INT XX =検索(+ n)が、YY =(B +見つけるN)。 40 であれば(X =!YY) 41 プレ[YY] =のX。 42 であれば(Y =!XX) 43 プレ[XX] = Y。 44 } 45 であれば(CH == ' A ' ) 46 { 47 INT X =(a)は、Yを見つける= 見つける(B) 48 INT XX =検索(+ n)が、YY =(B +見つけるN)。 49 であれば(x == y)が 50 のprintf(" 同じギャングで\ N。" ); 51 他の 場合(X == YY || Y == XX) 52 (のprintf「異なるギャングで\ n 」); 53 他の 54 のprintf(" わからない、まだ\ N。" ); 55 } 56 GETCHAR()。 57 } 58 } 59 リターン 0 。 60 }