지진은 동남 아시아에서 일어난다. ACM (아시아 제공처 의료 팀이) 무릎 컴퓨터와 무선 네트워크를 설정했지만, 예상치 못한 여진 공격, 네트워크의 모든 컴퓨터는 모든 졌 있었다. 컴퓨터는 하나 하나를 수리하고, 네트워크는 점차적으로 다시 작동하기 시작했다. 때문에 하드웨어를 제한의 각 컴퓨터는 직접 D로부터보다 멀리 떨어져 있지 않은 컴퓨터와 통신 할 수있다. 그러나 모든 컴퓨터는 다른 두 컴퓨터 간의 통신을 매개로 간주 될 수 있으며, 그 컴퓨터 A와 컴퓨터 B가 직접 통신 할 수 또는 A 모두와 통신 할 수있는 컴퓨터 C가있는 경우 컴퓨터 A와 컴퓨터 B가 통신 할 수 있다고하는 것이다 비.
네트워크를 수리하는 과정에서 작업자가 컴퓨터 수리, 또는 두 컴퓨터가 통신 할 수 있는지 테스트, 매 순간에 작업 두 종류의 수 있습니다. 당신의 임무는 모든 테스트 작업을 대답하는 것입니다.
네트워크를 수리하는 과정에서 작업자가 컴퓨터 수리, 또는 두 컴퓨터가 통신 할 수 있는지 테스트, 매 순간에 작업 두 종류의 수 있습니다. 당신의 임무는 모든 테스트 작업을 대답하는 것입니다.
입력
첫 번째 라인은 N과 D (1 <= N <= 1,001, 0 <= D <= 20000) 두 정수를 포함한다. 여기서 N은 1 내지 N 번째하는 컴퓨터의 수이고, D는 두 개의 컴퓨터가 직접 통신 할 수있는 최대 거리이다. 다음 N 라인에서, 각각의 N은 시스템의 좌표 두 정수 XI 이순신 (0 <= XI 이순신 <= 10000) 함유한다. 입력의 종료까지 (N + 1) 번째 행에서 하나씩 수행되는 작업이있다. 각 라인은 두 형식은 다음 중 하나의 동작을 포함
컴퓨터를 복구하는 수단 (P) 1. "O를 P '(1 <= p <= N).
컴퓨터 p와 q가 통신 할 수 있는지 여부를 테스트 수단 2. "S P는 Q '(1 <= P, Q <= N).
입력 라인은 300,000를 초과하지 않을 것이다.
컴퓨터를 복구하는 수단 (P) 1. "O를 P '(1 <= p <= N).
컴퓨터 p와 q가 통신 할 수 있는지 여부를 테스트 수단 2. "S P는 Q '(1 <= P, Q <= N).
입력 라인은 300,000를 초과하지 않을 것이다.
산출
각각의 테스트 작업, 인쇄 "성공"두 컴퓨터가 통신, 또는 할 수있는 경우를 들어 "FAIL"만약 없습니다.
샘플 입력
4 1 0 1 0 2 0 3 0 4 O 1 O 2 O 4 S 1~4 O 3 S 1~4
샘플 출력
FAIL SUCCESS의
문제의 의미 N 컴퓨터는 컴퓨터가 개발 m, (A)에 함께 접속 될 수 있고, B는 2 개에 연결될 수 있으며,이 손상은, B 및 C에 접속 될 수 있고,이어서 B (C)는 접속 될 수있다.
두 개의 작업 대문자 O와 대문자 S가 O가 S를 나타내는 수리 손상된 컴퓨터를 나타내는 존재하는지 여부를 시험 A와 B 사이의 연결. 첫 번째 열 (N)의 입력 (D).
N은 시스템의 n 번째 행의 위치를 나타내고, 그 후 문 아래에서, 각 명령의 실행, 테스트 용 문장이 출력되는 테스트 결과가 SUCCESS 또는 FAIL이다.
아이디어 : 단순 이산 집합은 최초의 좌표 시스템 사이의 관계는 최종 결정에 점 사이의 관계를 확인하는 농도로 변환된다.
코드 :
1 #INCLUDE <cstdio> 2 #INCLUDE <fstream> 3 #INCLUDE <알고리즘> 4 #INCLUDE <cmath> 5 #INCLUDE <양단> 6 #INCLUDE <벡터> 7 #INCLUDE <큐> 8 #INCLUDE < 문자열 > 9 # 포함 <CString을> 10 #INCLUDE <지도> 11 #INCLUDE <적층> 12 #INCLUDE < 설정 > 13 #INCLUDE <sstream> 14 #INCLUDE <iostream> 15 #DEFINE 개조 998,244,353 16 #DEFINE EPS를 1E-6 . 17 #DEFINE LL 긴 롱 18은 #DEFINE INF의 0x3f3f3f3f가 19. 은 USING 스페이스 STD, 20은 21 // 컴퓨터의 좌표 기록 22 것은 구조체 노드 (23)가 { 24 INT의 X, Y, 25 } 26없는 노드에 [ 1005 ] 27 // 에너지 절약 상기 X 번째 컴퓨터에 접속 된 컴퓨터 (28) 의 벡터 < INT > [VE 1,005 ] 29 // 컴퓨터를 복구 여부에 저장 30 BOOL VIS [ 1,005 ] 31은 32 // FA [X] (X)의 먼 조상 나타내고 33은 INT FA [ 50002 ] (34)가 // 초기화에 개별적으로 설정된 각각의 시작점 (35) 보이드 빌드 ( INT qwq) 36 { 37 위해 ( INT I = . 1 ; I <= qwq; I는 ++ ) (38)가 { 39 FA [I] = I는, 40 } (41)이 복귀 ; 42이다 } 43 인 // x의 가장 먼 조상을 찾아 압축 경로 (44)는 INT의 발견 ( INT X) 45 { 46은 IF(FA [X] == X) 47 { 48 리턴 X; 49 } 50 리턴 FA [X] = 찾기 (FA [X]); 51이다 } (52)이다 // 결정된 X는 Y가 동일한 세트가 아닌, 직접적인 먼 조상을 분석하는 동일하지 않은 53 인 BOOL 체 ( INT (X), INT의 Y) (54)가 { 55 반환 (X) == 찾기 (Y) 찾기; 56이다 } (57)이다 // 결합 된 X, Y, 우리는 x와 y가 결정 동일한는이 설정되지 않은 58 @ 경로 압축 FA는 [X], FA [Y 후 ] 이미 먼 조상, 59 // 그래서 직접 FA는 [X] 성부 FA [Y]에 접속 조상 60 빈메르 ( INT의 X, int로 Y)를 (61)는 { (62)는 IF (! 체는 (X는, Y)) (63)가 { 64 FA [FA [X] = FA [Y] 65 } 66 창 ; 67 } 68 INT Distan (노드 A 노드 B) (69) { 70 반환 (BX-AX) * (AX-BX) + (AY-) ※ (와우 - 화끈한데 의해) 71이다 } 72 // 설정 수리 컴퓨터 (X)에 x를 설정하고 X가 연결된 합한 73은 보이드 UPDATA ( INT X) 74 { 75 VIS [X] = 참 , 76 대 ( INT I = 0 ; I는 VE <[X] 크기는 (); I는 ++ ) 77 { 78 // 상기 X 연결 지점 (79) INT Y = VE [X] [I]; 80 // 병합 지점 y는 x와 y 깨어날 경우 81 IF (VIS [Y] &&! 체 (X, Y)) 82 { 83 메르 (X, Y); 84 } 85 } 86 } 87 INT 의 main () 88 { 89 INT의 N-, D, 90 는 scanf (" %의 D %의의 D " , N- & D) (91)이다 // 초기화 정보 (92) , 빌드 (N-) 93 // 기록 포인트 정보 (94) 에 대해 ( INT I = . 1 I <= N-; I는 ++ ) 95 { 96 는 scanf ( " %의 D %의의 D " , NO [I] .x와, NO [I] .Y); 97 } 98 // 함께 연결될 수 지점 사이 판정 트래버스 (99) 에 대해 ( INT I = . 1 ; I <= N-; 내가 ++ ) 100 { (101) 에 대한 ( INTJ = I는 + 1 , J <= N; J ++ ) 102 { 103 경우 (distan (NO [I] 없음 [J]) <= D * d) (104) { 105 적이 [I] .push_back (j); 106 적이 [J] .push_back (I); 107 } 108 } 109 } 110 숯 CH; 111 INT의 A, B; 112 동안 (는 scanf ( " %의 C " , 및 CH)! = EOF) 113 { 114 경우 (CH2 == ' O ' ) 115 { (116) 는 scanf ( " %의 D " , & A ) 117 UPDATA (A) 1 (18) } (119) 다른 IF (CH == ' S ' ) (120) { 121 는 scanf ( " %의 D %의의 D ' , A, 및 B); 122 // 두 함께 결합 될 수 나타낼 때 동일한 상위의 두 지점 (123) 에 IF (찾기 (a) == 찾기 (B)) 124 { 125 의 printf ( " N- \ SUCCESS " ); 126 } 127 밖의 128 { 129 의 printf ( " FAIL \ n을 " ); 130 } 131 } 132 } 133 }