ミミズのNOIP 2016(プライオリティキュー)

85回のプラクティス:

正方向の数に向かって移動された2つのワームから切断されている他のに加えて、(増加する長さを計算するミミズ、次いで遅延マークを使用して、最大プライオリティキューを見つけ、それは運動のマイナス方向に2つに同等ですあなたは長さの累積的な増加を記録することができ、いくつかのようにある数だけで結構マイナスに追加されていません)

書式#include <キュー> 
の#include <CStringの> 
の#include <iostreamの> 
の#include <cstdioを> 
する#include <cmath> 
の#include <アルゴリズム>
 使用して 名前空間はstdを、
typedefの長い 長いLL。
const  int型 MAXM = 1E5 + 7 INTのN、M、Q、U、V、T。
ダブルのp;
INT [MAXM]。
PRIORITY_QUEUE < 整数 > QQ;
INT =成長0// 总共增长的长度
INT メイン()
{ 
 scanf関数("%D%D%D%D%D%D "&N、&M&Q&U&V、& T)
  のためのint型 I = 1を iが<= N; iが++ 
 のscanf(" %dの、&​​A [i])と、qq.push([I]); 
 P =(ダブル)U / V;
  のためのint型 I = 1、I <= M; iが++ 
 { 
  int型トップ= qq.top()+ 成長。
  qq.pop(); 
  int型 A1 =床((ダブル)トップ*のP)、A2 =トップA1; 
  成長 + = Q; 
  A1 - = 成長; 
  A2 - =育ちます。// 次の値を約束プラス自身を育てる
  (A1)、qq.push(A2)qq.push;
   IF(I%のT == 0 
  のprintf(" %のD " 、トップ); 
 } 
 のprintf(" \ N- " );
  のためint型私は= 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 <アルゴリズム>
 使用して 名前空間はstdを、
typedefの長い 長いLL。
const  int型 MAXM = 7e6 + 7 INTのN、M、Q、U、V、T。
ダブルのp;
INT [MAXM]。
INT =成長0// 总共增长的长度
int型になりました[MAXM]、CUT1 [MAXM]、CUT2 [MAXM]。
int型H、H1、H2、T0、T1、T2。
int型のトップ。
int型国旗;
ブール CMP(INT A、INT B)
{ 
 戻り > Bと、    
} 
int型のmain()
{ 
 scanf関数(" %D%D%D%D%D%D "、&​​N、&M&Q、U、およびV、&&T)。
 以下のためにint型 i = 1 ; iが<= 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; iは++ 
 { 
   トップ = -2e9 + 7 
   フラグ = 0 もし(H <= T 0 &&今[H]>トップ)トップ=今[H]、フラグ= 1 もし(H1 <= T1 && CUT1 [H1]>トップ)トップ= CUT1 [H1]、フラグ= 2 もし(H2 <= T2 && CUT2 [H 2]>トップ)トップ= CUT2 [H 2]、フラグ= 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がM <= N +; I ++
 { 
      トップ = -1e9 + 7 
      フラグ = 0 もし(現在[H]>トップ&& H <= T0)トップ=今[H]、フラグ= 1 もし(CUT1 [H1]>トップ&& H1 <= T1)トップ= CUT1 [H1]、フラグ= 2 もし(CUT2 [H2]>トップ&& H2 <= T2)トップ= CUT2 [H 2]、フラグ= 3 もし(フラグ== 1 
     H ++ もし(フラグ== 2 
     H1 ++ もし(フラグ== 3 
     H2 ++ もし(I%T == 0 
      { 
       のprintf(" %dの"、トップ+ 成長)。    
     } 
 } 
 戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/lihan123/p/11741828.html