CF 1216f

https://codeforc.es/problemset/problem/1216/F

 

、コストは、ルータのコストを入れ私は、そのネットワーク、ルータは、いくつかの位置に配置することができ、各位置で費やさすることができる直線上のN個の位置があり、また、Iされている、ルータは可能後に配置されている[IK、I + K]の範囲でインターネット、各コンピュータは、最小のコストが必要とどのくらいの、インターネットへのアクセスが必要です。 

 

アイデア:動的プログラミング貪欲+ +セグメントツリーのメンテナンス 

 

F [i]はiのコンピュータへのアクセスを必要とする前に、最小のコストを表します。  

転送は2例に分けられた場合。  

1. I-独立したインターネット・コンピューター、コストが私に費やされています

F [I-1] + I 

I-2コンピュータのインターネットルータ上のコンピュータの前面から、貪欲の原理によれば、確かに[IK、I-1]でカバーが大きくなることがあり、最小のローカルルータの位置の内側に置くことができ、第二に低コスト。  

私たちは、半分を見つけるために、ツリー内のセグメントによって、この位置を維持することができます。

転送する場合、細心の注意間隔がオーバーラップしてもよいので、我々は転送する、またはセグメントツリーをどうする最小間隔が必要です。  

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、 
3  の#define LL長い長
 4  の#define LC(X << 1)  
 5  の#define RC(X << 1 | 1)  
 6  の#define中間(L + R)/ 2     
 7  INTの CONST N = 200000 + 10 8  チャーS [N]。  
9 LLをF [N]、V [N << 2 ]。  
10  int型 N、K、合計[N << 2 ]、POS [N << 2 ]。   
11  ボイドビルド(int型のx、int型の L、INT R){
 12      であれば(L == R){
 13          和[X] = S [L] == ' 1 ' 14          であれば(和[X])posが[X] = L。  
15          リターン;  
16      }
 17      ビルド(LC、L、MID)。  
18      ビルド(RC、ミッド+ 1 、R)。  
19      和[X] =和[LC] + 和[RC]。  
20      であれば(POS [LC])POS [X] = POS [LC]。  
21台の     他の POS [X] = POS [RC]。  
22  }
 23  int型の照会(int型のx、int型 L、INT R、INT LL、INT RR){
 24      であれば(LL <= 1 && R <= RR){
 25台の         リターンPOS [X]。 
26      }
 27      のint T1 = 0、T2 = 0 28      であれば(LL <= MID)T1 = クエリ(LC、L、中間、LL、RR)。  
29      であれば(T1)戻りT1。  
30      であれば(RR> MID)T2 =クエリ(RC、ミッド+ 1 、R、LL、RR)。  
31      リターンT2;  
32  }
 33  空隙インサート(int型のx、int型の L、int型の R、int型のP、LLテレビ){
 34      であれば(L == R){
 35          V [X] = テレビ。  
36          リターン;  
37      }
 38      であれば(p <= MID)(LC、L、中、P、TV)を挿入します。  
39      他の挿入(RC、ミッド+ 1 、R、P、TV);  
40      V [X] = 分(V [LC]、V [RC])。  
41  }
 42 LL(ASK INT X、int型の L、INT R、INT LL、INT {RR)  
43      であれば(LL> RR)戻り1E18。     
44      であれば(LL <= 1 && R <= RR){
 45          リターンV [X]。  
46      }
 47      LL RES = 1E18。  
48      であれば(LL <= MID)RES = 分(RESは、(ASK LC、L、中間、LL、RR))。  
49      であれば(RR> MID)RES =分(RES、尋ねる(RC、ミッド+ 1 、R、LL、RR))。  
50      リターンのres;  
51  }
 52  INT メイン(){
 53      のscanf(" %D%dの"、&​​N&K)。  
54      のscanf("%S "、S + 1 ); 
 55      ビルド(11 、N)   
 56      のためのint型 I = 1は iがn = <; iは++ ){
 57          F [i]は= F [I- 1 ] + I;  
 58          INT、T =クエリ(11、nは、MAX(1、I- K)、i)は、  
 59          であれば(T){
 60              のint p = MAX(1、TK- 1 );  
 61              LLのtmpが=尋ねる(11、N、P、I- 1);  
62              であれば(TK- 1 < 1)TMP = 0 63              F [I] =分(F [i]が、TMP + T)。   
64          }
 65          インサート(11 、N、I、F [I])。  
66      }  
 67      COUT << F [N] << ENDL。  
68      リターン 0 ;  
69 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/ZJXXCN/p/11601223.html