P1661拡散(+互いに素なセットバイナリ)

タイトル説明

図に示すように、点毎時間単位は、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 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/qq-1585047819/p/11256837.html