タイトル説明
図に示すように、点毎時間単位は、4つの方向の距離を拡散します。
2点A、BのEと呼ばれる通信、(a、b)は、場合にのみ拡散領域と、(b)は一般的です。通信ブロックの定義はブロックU内の任意の2点であり、Vパスが失敗E(U、A0)、E(A0、A1)、···、E(AK、V)なしで存在します。Nに与えられた平面上の点に、それらが通信ブロックを形成することを最も早い時間が何であるかを尋ねました。
入力形式
数nは、n行の最初の行は、各ラインの点座標。
[データ]スケール
1≤X[i]は、Y [i]が≤50、データの20%を、1≤N≤5を満たすために。
データ満たす1≤N≤50の100%、1≤X[I]、Y [i]が≤10^ 9。
出力フォーマット
全ての通信ブロックの最も早い時点を表す数値が形成されています。
サンプル入力と出力
入力#1
2 0 0 5
出力#1
コードの表示
5
ソリューションの概要:限り+水平「= 2 * tはこれら2点を満たすでしょうから、2つの点が垂直距離を見つけることとして、(乗算ポイントはいくつかの法則を発見しよう)通信ブロックは、最初の2つの互いに素設定された時間のポイントが解決そして思いましたオンライン
1の#include <cstdioを> 2の#include <CStringの> 3の#include <アルゴリズム> 4 の#defineのEPS 1E-6 5 使用して 名前空間STDを、 6のtypedef 長い 長LL。 7 8 INT N。 9 LLのX [ 55 ]、Y [ 55 ]。 10の LLのARR [ 55 ]。 11 12 のLL find_rootは(LL x)から{ 13 リターン ARR [X] == X X:ARR [X] = find_rootは(ARR [X])。 14 } 15 16 BOOLチェック(LL NUM){ 。17 INT ANS = 0 ; 18である ため(INT I = 1 ; I <= N; I ++)ARR [I] = I; 19 用(INT I = 1 ; I <= N; I ++は){ 20である ため(int型 J = I +は1。 ; J <= N; J ++ ){ 21は IF(ABS(X [I] -X- [J])+ ABS(Y [I] -Y [J])<= 2 * NUM ){ // この時間内に二点満たすことが可能NUMができる 22である LL = XXのfind_rootは(I) 23は、 LL = YYのfind_rootは(J); 24 ARR [XX] YYを=。 /// 要找根啊 25 } 26 } 27 } 28 のための(int型 I = 1 ; I <= N; iは++ ){ 29 であれば(ARR [I] == I)ANS ++ 。 30 } 31 であれば(ANS == 1)を返す 真。 32は、 他の 返却 はfalse ; 33 } 34 35 空隙二分法(){ 36 LL左= 0、右= 1E9と、 37 ANS LL; 38 一方(左<= 右){ 39 LLミッド=左+右>> 1 。 40 であれば(チェック(MID))右=ミッド1、ANS = ミッド。 41 他に =ミッド+左1 。 42 } 43 のprintf(" %LLDする\ n " 、ANS)。 44 } 45 46 INT メイン(){ 47 のscanf(" %d個"、&N) 48 のためには、(int型、I = 1(scanf関数をiは++; iがn = <)" %LLDの%のLLD "、およびX [i]は、&Y [I])。 49 二分法(); 50 リターン 0 ; 51 }