https://vjudge.net/problem/Gym-102346A
問題の意味:モニターの範囲を決定するには、右上と左下をブロックすることができます。
分析:互いに素なセットの処理を使用して図は、組み合わさモニタに接続することができ、そして各セットの最終的なマークが左下、右上、左、上部および下部成形ブロック境界に接続することができます。
注:各セットは、次の祖先マーキングに(x)を見つけることができます。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 1E5 + 5 。 const int型のmod = 998244353 ; INT [MAXN]事前; 構造体ノード{ int型X、Y、L。 } [MAXN]です。 ブールチェック(ノードA、ノードB){ リターン((AX-BX)*(AX-BX)+(AY-によって)*(AY-によって)<=(a.l + BL)*(a.l + BL )); } int型の検索(INT X){ 場合(X!= 事前[X]){ [X]事前 = (予備[X])を見つけます。 } リターン[X]事前; } 無効連合(int型のx、int型のY){ int型 RX = =(X)、RYを見つける(y)を検索します。 もし((X)!=見つける{)(Yを見つけます。) 事前[RX] = RY。 } } 構造体ノード{ int型のX、Y、B。 }年[MAXN]。 INT {main()の イオス:: sync_with_stdio(偽); cin.tie(0 )。 INTのN、M、K。 CIN >> M >> N >> K。 以下のために(int型 i = 1 ; iは= Kを<; iは++ ){ CIN >> S [i]は.X >> S [i]は.Y >> S [i]の.L。 } 以下のために(int型 i = 1 ; iは= Kを<; iは++ ){ 事前[I] = I。 } 以下のために(int型 I = 1 ; I <= K- 1 ; I ++ ){ ための(int型 J = iは+ 1、J <= kであり、j ++ ){ 場合(チェック(S [i]は、S [J])){ 連合(i、j)は、 } } } 以下のために(int型 i = 1 ; iは= Kを<; iは++ ){ もし、(S [i]が.X <=のS [I] .L){ ANS [(I)検索] .X = 1 。 } もし(S [i]が.Y <=のS [I] .L){ ANS [(I)検索] .Y = 1 。 } もし(MS [I] .X <=のS [I] .L){ ANS [(I)検索] .A = 1 。 } もし(NS [I] .Y <=のS [I] .L){ ANS [(I)検索]、B。 = 1 。 } } BOOL = OK 0 ; 以下のために(int型 i = 1 ; iは= Kを<; iは++ ){ 場合(ANS [I] .X == 1つの && ANS [I] .Y == 1 ){ OK = 1 ; } もし(ANS [I] .A == 1つの && ANS [I] .B == 1 ){ OK = 1 ; } もし(ANS [I] .X == 1つの && ANS [I] .A == 1 ){ OK = 1 ; } もし(ANS [I] .Y == 1つの && ANS [I] .B == 1 ){ OK = 1 ; } // coutの<< ANS [I] .X <<」「<< ANS [i]は.Y <<てendl; } であれば(OK)COUT << " N " << ENDL。 他の裁判所未満<< " S " << てendl; }