木が戻って操作[貪欲]

 

それは理解の多くは、問題の解決策ではない、制限されています

 

このこんにゃくを見ていただきありがとうございます

 

 

トピックポータル

 

 

そこに特定の分析ギャングのブログ

 

推奨ブログ

 

私は、実装の下でどのようにコードの面でここにいます

 

私たちは、ヒープの最適化を達成するためにペアを使用し、最初の重みに代わって、位置の値の第二の表現を

 

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 }

 

おすすめ

転載: www.cnblogs.com/nlyzl/p/11727394.html