それは理解の多くは、問題の解決策ではない、制限されています
このこんにゃくを見ていただきありがとうございます
トピック:ポータル
そこに特定の分析ギャングのブログ
推奨:ブログ
私は、実装の下でどのようにコードの面でここにいます
私たちは、ヒープの最適化を達成するためにペアを使用し、最初の重みに代わって、位置の値の第二の表現を
1つの 空隙デル(INT X){ 2 プリ[NXT [X] = 予備[X]。 3 NXT [プレ[X] = NXT [X]。 4 フラグ[X] = 真。 5 }
上記のコードは、どのようにそれを理解するには?
マップを見てください:
のは、4点を数えてみよう
基づき、もし基本的な貪欲な戦略(すなわち、いずれか大きい方)
それは次のようになります。
しかし、我々はこれが最適な解決策ではないことがわかったANS == 16よりも大幅に少ないANSの== 10、
このケースでは、行われる操作戻って、すなわち償還、差分演算子を
我々はレコード取る現在のノードの2つのノード間の違いについて、その最大値(TO 操作戻っすなわち償還を促進します)
これは、実測値:差が7(8 = 7 + 8-9)
その後、我々は入れてオリジナルの9の位置に7を
我々が見つかりました。私たちは9がタグ付けされて取る8時に、あなたが取ることができません
すなわち:
1つのフラグ[X] = 真。
以下のためにポイントを取られていない、我々はそれがヒープを終了させる必要があり、すなわち、内側:
1つの 一方(フラグ[Q.top()秒]){ 2 Q.pop()。 3 }
この場合、パイル7の最大値は、ANS 7を更新するために取られました
1あらかじめ[NXT [X] = 予備[X]。 2 NXT [プレ[X] = NXT [X]。
したがって、これら二つの言葉の意味します:
mがn回よりも大きい場合、それは明らかに完全にm種類(のないセパレータは空介在)、そう直接出力エラー!
コード:
1の#include <ビット/ STDC ++ H> 2 の#pragma GCCの最適化(3) 3 の#define INT長い長 4 のconst int型 N = 1E6 + 10 。 5 使用して 名前空間はstdを、 6 ブールフラグ[N]。 7 INTのN、M、ANS、ノード[N]、プリ[N]、NXT [N]。 8 PRIORITY_QUEUE <ペア< int型、int型 >> Q; 9インラインint型リード(){ 10 、INT X = 0、F = 1。チャー CH = GETCHAR()。 11 ながら(!isdigit(CH)){ 場合(CH == ' - ')、F = - 1 ; CH = GETCHAR();} 12 ながら(isdigit(CH)){X =(X << 1)+( X << 3)+(CH ^ 48)、CH = GETCHAR();} 13 リターンのX *はF; 14 } 15 空隙デルを(INT X){ 16 プレ[NXT [X] = 予備[X]。 17 NXT [プレ[X] = NXT [X]。 18 フラグ[X] = 真。 19 } 20 空隙貪欲(){ 21 ながら(フラグ[Q.top()秒]){ 22 Q.pop()。 23 } 24 のint A = Q.top()は、第2。 25 Q.pop()。 26の ANS + = ノード[A]。 27 ノード[A] =ノード[NXT [] +ノード[[事前] - [A]ノードと、 28 デル(PRE [A])。 29 デル(NXT [A])。 30 Q.push(make_pair(ノード[A]、a)参照)。 31 } 32は、 符号付き()主 33 { 34 N =読み取る()、M = 読み取ります(); 35 のために(INT I = 1;私は++; iが<= N ){ 36 [I] =ノード)(読み取ります。 37 プレ[I] = I- 1 。 38 NXT [I] = I + 1 。 39 Q.push(make_pair(ノード[i]は、I))。 40 } 41の 予備[ 1 ] = N。 42 NXT [N] = 1 。 43 もし(M * 2 > N){ 44 のprintf(" エラー!" )。 45 リターン 0 ; 46 } 47 のために(int型 I = 1 ; I <= M; iは++ ){ 48 貪欲()。 49 } 50 のprintf(" %のLLD " 、ANS)。 51 リターン 0 。 52 }