지렁이의 NOIP 2016 (우선 순위 대기열)

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 ;    
}

 

추천

출처www.cnblogs.com/lihan123/p/11741828.html