제목 설명
도에 도시 된 바와 같이 시점마다 유닛, 4 개 방향에서의 거리를 확산한다.
두 개의 점 A, B에서 E로 언급 통신, (a, b)의 경우, 단지 확산 영역 경우 A, B는 공통이다. 통신 블록의 정의는 U 블록 내의 임의의 두 지점이며, V 경로 (U, A0), E (A0, A1), 즉 확실하게 존재한다, ... E (AK, V). 주어진 평면상의 한 점에 n으로, 그들은 통신 블록을 형성 빠른 시간 무엇인지 물었다.
입력 형식
다수 (N)의 첫번째 행, n 개의 선, 각 광고 포인트 좌표.
[데이터] 스케일
1≤X [I], Y [i]를 ≤50 상기 데이터의 20 %, 1≤N≤5 부합하는 단계;
1≤X [I], Y [i]를 ≤10 ^ 9 상기 데이터 만족 1≤N≤50 100 %이다.
출력 형식
모든 통신 블록의 최초의 시각을 나타내는 숫자가 형성된다.
샘플 입출력
입력 # 1
2 0 0 5 5
출력 # 1
코드보기
5
솔루션의 개요 :만큼이 같은 점은 수평 + "= 2 * t이 두 점을 만날 것으로부터의 수직 거리를 찾기 위해 통신 블록 먼저 두 개의 분리 된 설정 한 시점이 해결 생각 (곱셈 포인트는 몇 가지 법이 찾을하려고 할 수 있습니다) 라인에
1 #INCLUDE <cstdio> 2 #INCLUDE <CString을> 3 #INCLUDE <알고리즘> 4 #DEFINE의 EPS를 1E-6 5 이용 스페이스 성병; 6 타입 정의 긴 긴 LL; 7 8 INT의 N; 9 LL의 X [ 55 ], Y [ 55 ]; 10 개 LL의 도착 [ 55 ]; 11 12 LL의 find_root (LL의 X) { 13 반환 도착 [X] == X X : 도착 [X] = find_root (도착 [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 ) { // 이 시간 내에 두 지점 충족시킬 수 민 22 인 LL = XX의 ; find_root (I) (23)는 LL = YY의 find_root (J)를, (24) 도착 [XX]을 YY =; /// 要找根啊 25 } 26 } 27 } 28 대 ( int로 I = 1 ; I <= N; 내가 ++ ) { 29 일 경우 (도착 [I] == I) ANS ++ ; 30 } 31 경우 (ANS == 1 ) 반환 사실 ; (32) 다른 돌아 거짓 ; 33 } 34 35 공극 이분법 () { 36 LL은 왼쪽 = 0 , 우측 = 1E9 단계; (37) ; ANS LL 38 동안 (좌회전 <= 우측) { 39 LL = 중간 좌측 + 우측 >> 1 ; 40 의 경우 (검사 (MID)) = 오른쪽 미드 1 , ANS = 미드; 41 다른 왼쪽 미드 = + 1 ; 42 } 43 의 printf ( " % LLD \ 없음 " , ANS); 44 } 45 46 INT 의 main () { 47 는 scanf ( " %의 D ' , N); (48) 에 대한이 ( int로 I = 1 (는 scanf를 난 ++; i가 N = <)" %의 LLD의 %의 LLD " , X [I], Y [I]); 49 이분법 (); 50 반환 0 ; 51 }