의 #pragma GCC의 최적화 (2) 의 #pragma GCC의 최적화 (3) 의 #pragma (4) GCC의 최적화 #INCLUDE <비트 / stdc ++. H> #DEFINE는 LL 긴 긴 #DEFINE의 LD 긴 이중 #DEFINE의 ULL 부호 긴 긴 #DEFINE의 인터넷 제 #DEFINE SE 제 #DEFINE MK make_pair #DEFINE PLL 쌍 <LL, LL> #DEFINE의 PLI 쌍 <LL, INT> #DEFINE PII 쌍 <INT, INT> #DEFINE SZ (X) ((INT) x.size () ) #DEFINE ALL (x)를 (x)를 .begin (), (X) .END () #DEFINE FIO IOS :: sync_with_stdio (거짓); cin.tie (0); 사용 네임 스페이스 표준; CONST의 INT의 N = 5000 + 7 ; CONST INT INF = 0x3f3f3f3f ; CONST LL = INF 0x3f3f3f3f3f3f3f3f ; CONST INT 개조 = 998,244,353 ; CONST 두 EPS 1e- = 8 ; CONST 이중 PI ACOS = (- 1 ); 서식 < 클래스 T, 클래스 S> 인라인 공극 추가 (T & A, S의 b) {A = B +; 경우 (a> = 개조) A - = 개조} 템플릿< 클래스 T, 클래스 S> 인라인 공극 부 (T & A, S의 b) {A - = B를; 경우 (A < 0 )은 + = 개조} 템플릿 < 클래스 T, 클래스 S> 인라인 BOOL chkmax (T & A, S B)는 { 반환 은 <B를? A = B, 참 : 거짓 } 템플릿 < 클래스 T, 클래스 S> 인라인 부울 chkmin (T & A, S의 b) { 반환 A> B를? A = B, 참 : 거짓 } mt19937 RNG (크로노 :: steady_clock : 지금 () time_since_epoch () COUNT ()..); 벡터 < INT > G [N]; 벡터 < INT > RG [N]; INT L [N] totL; INT R [N] totR; 불리언 힘 [N]; INT matchL [N] matchR [N]; 불리언 visL [N] visR [N]; 벡터 < INT > V; INT 경로 ( INT U) { visL는 [U]가 = 참 ; 대 (자동 및 {G [U] v)의 경우 (! visR [V]) { visR [V]= 진정한 ; 경우 (matchR [V] == 0 || 경로 (matchR [V])) { matchR [V] = U; matchL [U] = V; 반환 1 ; } } } 반환 0 ; } INT 의 main () { INT에서 CNT = 0 ; 위한 ( int로 I = 1 ; I <= totL; 내가 ++ ) { memset 함수 (visL, 0 , sizeof 연산자 (visL)); memset 함수 (visR, 0, 는 sizeof (visR)); 경우 (경로 (Ⅰ)) { CNT ++ ; } } CNT = N - CNT; memset 함수 (visL, 0 , 는 sizeof (visL)); memset 함수 (visR, 0 , 는 sizeof (visR)); 위한 ( int로 I = 1 ; I <= totL; 내가 ++ ) { 경우 (! {matchL [I]) 경로 (Ⅰ); } } 에 대해 ( int로 I = 1 ; I <= totL; 내가 ++ ) { 경우 (visL [I]) { V.push_back (L [I]); } } 에 대해 ( int로 I = 1 ; I <= totR; 내가 ++ ) { 경우 (! {visR [I]) V.push_back (R [I]); } } 의 printf ( " % D \ 없음 " , CNT); 위한 ( int로 I = 0 ; I는 SZ (V) "; 나는 ++ ) { printf와 ( " % d 개 %의 C ' , V를 [I], " \ n " [I == SZ (V) - 1 ]); } 반환 0 ; } / * * /