C.計画
ヘレンはメトロポリスの空港で動作します。彼女は出発のスケジュールを作成する責任があります。あり n個の 今日を出発しなければならない便は、 私の彼らの目はに出発する予定です 私の日の番目の分。
メトロポリスの空港はMetropoliaの主要交通機関のハブであるので、そのままスケジュールを維持することは困難です。これはまさに今日のケースである。なぜなら、技術的な問題のため、何の便は、最初の時に出発できなかった k個の 日の分、今、新たな出発スケジュールを作成する必要があります。
すべての n個の 定期便は今の間で異なる分に出発しなければならない (K + 1)番目と (K + N)番目の、包括的。新しいスケジュールで自分の順番が異なる場合があります-便は、彼らが最初にそうするようにスケジュールされたのと同じ順序で出発するためにしかし、それは必須ではありません。唯一つの制限があります:何の飛行は、それが最初のスケジュールで出発することになっていたよりも早く出発することは許されません。
ヘレンはの遅延の各分ということを知っている 私番目のフライトは、空港コスト C I burlesを。フライトは、空港の総コストを最小限に抑える新しいスケジュールに出発するために彼女が注文を見つけます。
最初の行は二つの整数が含ま N と K (1つの≤ k個の ≤を n個 300 000≤)、ここで nは フライトの数であり、 kは 便が出発しなかったことを一日の始まりの分数です。
2行目は含まれて 、n個の 整数 C 1、 C 2、···、 C N (1個の≤ C iは ≦10 ここで、7) cのiは 遅延のコストであり、 I 1分間目飛行。
最初の行便を遅らせる可能な最小総コストが含まれている必要があります。
第二行は含まれている必要があり 、N 異なる整数 、T 1、 T 2、...、 T N (K + 1≤ T iは ≤ K + Nが)、ここで tはiが 微小である I番目の飛行出発しなければなりません。いくつかの最適なスケジュールがある場合は、それらのいずれかを印刷します。
5 2
4 2 1 10 2
20
3 6 7 4 5
私たちは、サンプルテストを考えてみましょう。ヘレンは、ちょうどすべてのフライト移動した場合 2分後に順序を維持し、フライトを遅延させるの総コストは次のようになり (3 - 1)・4 +(4 - 2)・2 +(5から3)・1 +(6 - 4 )・10 +(7から5)・2 = 38 burles。
しかし、より良いスケジュールは、サンプル回答で示され、そのコストは (3 - 1)・4 +(6 - 2)・2 +(7 - 3)・1 +(4 - 4)×10 +( - 5 5)・2 = 20burles。
質問の意味:そこn個のプレーン、1〜Nが続く元の出発時刻、k個分前であるが、離陸することはできません、1分あたりの最初の知られている航空機の遅延、私はCIとして過ごす、以前の予定より離陸することはできませんが、各フレームを尋ねました最初の飛行機の中で少なくとも数分を過ごすために離陸しました。
ソリューション:彼らは内部のプライオリティキューに離陸できる航空機の最初の数秒で以前の予定より、私たち最初のk + Iを脱ぐことができないので、その後、分を費やしたり手配するために彼を比較し、同じ時間の前に高いポップアップを過ごします離陸するための時間。(また集合と(セット)をソートするために使用されます)
コード:
#include <ビット/ STDC ++ H> の#defineは長い長いllの 使用 名前空間STDを、 CONSTの INT N = 3E5 + 10 。 構造体ノード{ int型のID、C。 ブール 演算子 <(constのノード&X)のconst { 場合(C == XC)戻り ID < x.id。 リターン C < XC。 } } [N]、X; INTのANS [N]。 INT のmain(){ int型N、K。 scanf関数(" %d個の%のD "、&N、&K)。 以下のために(int型 i = 1 ; iが<= N; iが++ ){ scanf関数(" %dを"&[I] .C)。 [I] .ID = iは、 } LL和 = 0 。 PRIORITY_QUEUE <ノード> Q。 以下のために(int型 i = 1 ; iは= Kを<I ++はq.push([i])とします)。 以下のために(int型 I = K + 1、iが<= K + N; I ++ ){ 場合(iは= < q.push n)を([I])。 X =q.top(); q.pop(); 合計 + =μlの*(ix.id)* XC; ANS [x.id] = I。 } のprintf(" %LLDする\ n " 、合計)。 以下のために(int型 i = 1 ; iが<= N; iは++ ) のprintf(" %d個の%のC "、ANS [i]は、I == N?' \ n ':' ' )。 リターン 0 ; }
#include <ビット/ STDC ++ H> の#defineは長い長いllの 使用 名前空間STDを、 CONSTの INT N = 3E5 + 10 。 構造体ノード{ int型のID、C。 } [N]、X; BOOL CMP(ノードI、ノードj){ 場合(IC == JC)を返す i.id> j.id。 返す IC> JCを。 } INT ANS [N]。 設定 < 整数 > 秒; INT のmain(){ int型N、K。 scanf関数(" %d個の%のD "、&N&K)。 以下のために(int型 i = 1 ; iが<= N; iが++ ){ scanf関数(" %dを"&[I] .C)。 [I] .ID = iは、 s.insert(I + K)。 } ソート(A + 1、A + N + 1 、CMP)。 LL合計 = 0 ; 以下のために(int型 i = 1 ; iが<= N; iは++ ){ int型のx = * s.lower_bound([I] .ID)。 和 + = 1LL *(XA [I] .ID)* [I] .C。 ANS [[I] .ID]= X。 s.erase(X)。 } のprintf(" %LLDする\ n " 、合計)。 以下のために(int型 i = 1 ; iが<= N; iは++ ) のprintf(" %d個の%のC "、ANS [i]は、I == N?' \ n ':' ' )。 リターン 0 ; }