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 ビルド(1、1 、N) 56 のための(int型 I = 1は iがn = <; iは++ ){ 57 F [i]は= F [I- 1 ] + I; 58 INT、T =クエリ(1、1、nは、MAX(1、I- K)、i)は、 59 であれば(T){ 60 のint p = MAX(1、TK- 1 ); 61 LLのtmpが=尋ねる(1、1、N、P、I- 1); 62 であれば(TK- 1 < 1)TMP = 0 。 63 F [I] =分(F [i]が、TMP + T)。 64 } 65 インサート(1、1 、N、I、F [I])。 66 } 67 COUT << F [N] << ENDL。 68 リターン 0 ; 69 }