85 개 사례 :
정방향 번호 향해 이동하는 두 개의 웜 절단 등 이외에 (증가하는 길이를 계산하기 위해 지렁이, 다음 지연 표시를 이용하여 최고 우선 순위 큐를 찾아 그 움직임의 마이너스 방향으로 2 개에 상당 당신이 길이의 누적 증가를 기록 할 수있는 있도록하는 거기에 몇 가지 잘 마이너스에 추가되지 않음)
#INCLUDE <큐> #INCLUDE <CString을> #INCLUDE <iostream> #INCLUDE <cstdio> #INCLUDE <cmath> #INCLUDE <알고리즘> 사용 스페이스 성병; 타입 정의 긴 긴 LL; CONST INT의 MAXM 1E5 + = 7 ; INT의 N, M, Q, U, V, t; 이중 피; INT A [MAXM]; priority_queue < INT > QQ; INT = 성장 0 ; // 总共增长的长度 INT 주 () { 는 scanf ( "% D % D % D % D % D % D " , 및 N, M, Q, U, V, t) 에 대해 ( int로 I = 1 난 ++] i가 N = <; ) (scanf와를 " 가 % d " , & A [I]) qq.push (a [I]); P = ( 더블 ) 유 / V는, 위한 ( int로 I = 1 ; I <= m; 내가 ++ ) { INT 가기 = qq.top () + 성장; qq.pop (); INT A1 = 바닥 (( 더블 ) 최상부의 P *) (A2) = 리면 A1, 성장 + = Q를, A1 - = 성장; A2를 - = 성장;// 약속 다음 값을 더한 자신을 성장 (A1)을 qq.push, qq.push (A2), IF (I %의 T의 == 0 ) 의 printf ( " % d 개 " , 탑); } 의 printf ( " \ N- " ) 에 대한 ( INT I = . 1 I는 <= N-m의 +; I는 ++ ) { int로 상위 = qq.top을 () + 성장; qq.pop을 (), IF (I의 %의 T의 == 0 ) { 에서 printf ( " D % " , 탑); } } 반환 0 ; }
나쁜 예 :
첫 번째로 큰 지렁이 지렁이 후 소정 컷오프보다 지렁이 지렁이로 절단 발견이를 직접 어레이에 저장 될 수있다.
#INCLUDE <큐> #INCLUDE <CString을> #INCLUDE <iostream> #INCLUDE <cstdio> #INCLUDE <cmath> #INCLUDE <알고리즘> 사용 스페이스 성병; 타입 정의 긴 긴 LL; CONST INT의 MAXM = 7e6 + (7) ; INT의 N, M, Q, U, V, t; 이중 피; INT A [MAXM]; INT = 성장 0 ; // 总共增长的长度 INT 지금 [MAXM] cut1 [MAXM] cut2 [MAXM]; INT의 H, H1, H2, T0, T1, T2; INT 최고; INT깃발; 부울 CMP ( int로 하는 INT의 b) { 반환 A> B 단계; } INT 의 main () { 는 scanf ( " % D % D % D % D % D % D " , 및 N, M, Q, U, V, 및 t); 위한 ( int로 I = 1 ; 나는 <= N; ++ i가 ) 는 scanf를 ( " 가 % d " , 현재 [I]); P = ( 더블 ) U / ( 더블 ) V; H = H1 = H2 = 1 ; T0 = N; T1 = T2 = 0; 정렬 (지금 + 1 , 지금 + N + 1 , CMP); 위한 ( int로 I = 1 ; I <= m; 내가 ++ ) { 상부 = -2e9 + 7 ; 플래그 = 0 ; 경우 (H <= T0 && 이제 [H] -> 상단) 위쪽 지금 = [H], 플래그 = 1 ; 경우 (H1 <= T1 && cut1 [H1]> 상단) 위쪽 cut1 = [H1, 플래그 = 2 ; 경우 (H2 <= T2 && cut2 [H2]> 상단) 위쪽 cut2 = [H2] 플래그 = 3 ; 경우 (플래그 == 1 ) H ++ ; 경우 (플래그 == 2 ) H1 ++ ; 경우 (플래그 == 3 ) H2 ++ ; 상단 + = 성장; INT A1 = 바닥 (( 더블 ) 최상부의 P *) (A2) = 리면 A1; 성장 + = Q를; A1 - = 성장, A2- = 성장; cut1 [ ++ T1 = A1, cut2 [++ T2 =의 A2; 경우 (I %의 T는 == 0 ) 의 printf ( " %의 D " , 상단); } 의 printf ( " \ n을 " ); 위한 ( int로 난 = 1 i가 N + m = <; 내가 ++) { 상부 = -1e9 + 7 ; 플래그 = 0 ; 경우 (현재 [H] -> 상단 &&의 H <= T0) 위쪽 = 지금 [H], 플래그 = 1 ; 경우 (cut1 [H1]> 상단 && H1 <= T1) 위쪽 cut1 = [H1, 플래그 = 2 ; 경우 (cut2 [H2]> 상단 && H2 <= T2) 위쪽 cut2 = [H2] 플래그 = 3 ; 경우 (플래그 == 1 ) H ++ ; 경우 (플래그 == 2 ) H1 ++ ; 경우 (플래그 == 3 ) H2 ++ ; 만약(I %의 T는 == 0 ) { 의 printf ( " % d의 " 최고 + 증가); } } 반환 0 ; }