トピックへのリンク:https://codeforces.com/problemset/problem/1216/F
タイトル効果: - 私は、n個(K 1、I)、(右最大にn個のお部屋は、部屋が左へとルータのカバレッジmaxに、ルータ(部屋番号のIのための価格)に代わってインストールすることができ、そこにあります+ k)は0ルータが直接アクセス部屋番号iについて(価格)に接続されるように、部屋の代わりに設置することができない、またはネットワークルータ)はコストをかけず(部屋のインストールをこすることができます。Q.ましょうnは、この部屋は、すべての最小コストであるインターネットに接続することができます。
セグメントツリーのメンテナンスDPと
(1)ルータ、使用済に必要な最小のコスト(0)/放電i番目の位置を保持し、1カバーの位置を完了 - DPを設け[i]は[0/1]私は正面を表します。
以下の状態遷移を考えてみましょう:
1つの部屋のすべての最小コストでインターネットに接続している、 - 私は前に仮定
- これは部屋の属性が0または1であるかどうかである:DP [i]が[0] =分{DP [iが - 1] [0] + iは、クエリが(ルータの前面、1、1に入れて、N、I - K 、I - 1)}。
これは、i番目の部屋ホールドルータ、私の部屋の前に私の前に接続されたすべての経費インターネット=分{ - 1つのベッドルーム接続されたすべての最小コストのインターネット+コストに直接接続されたI-I室内インターネット、摩擦フロントネットワークルータが部屋に置かれている}(i番目の部屋はどんな対価を費やすことなく、この場合には、この時間は、転送のコストは、それの前に置かれると、ルータのコストは同じ部屋で)
ルータ2.部屋に配置することができ、そこである:DP [I] [1] =分{クエリ(1、1、ルータの前に置く、N、I - K、I - 1)、クエリ(フロント保持ルータ、1 、1、B、I - K - 1、I - 1)} + I。
これは私の部屋は、すべての最小コストのインターネットアクセスに必要=分{[1 - K - - 私は1、i]が接続される前に、i番目の部屋は、放電ルータを選択したことを意味する前の間隔で最小の使用ルータ[ I - K、I - 1]間隔のルータ最小なしにこの部屋に配置されている} +コストルータI
1の#include <iostreamの> 2の#include <ベクトル> 3の#include <地図> 4の#include <アルゴリズム> 5の#include <キュー> 6の#include <cstdioを> 7の#include <cmath> 8の#include < ストリング > 9#含む< 設定 > 10の#include <複合> 11の#include <cstdioを> 12の#include <CStringの> 13の#include <積層> 14の#include <iomanip> 15の#include <ビットセット> 16の#include <のTypeInfo> 17の#include <ランダム> 18#include <unordered_map> 19の#include <unordered_set> 20 使用 名前空間STDを、 21 22 のconst int型 MAXN = 2E5 + 10 。 23 CONST 長い 長い INF = 0x3f3f3f3f3f3f3f3f 。 24 25 のint N、K。 26 チャーSTR [MAXN]。 27 長い 長い DP [MAXN] [ 5 ]。 28 29 長い 長い tree_no [MAXN * 4 ]。 30 長い 長い tree_yes [MAXN * 4]; 31 32 空隙 push_up(長い 長 TMP []、INT RT){ 33 INT LS = RT * 2、RS = RT * 2 + 1 。 34 TMP [RT] = 分(TMP [LS]、TMP [RS])。 35 } 36 37 空隙ビルド(長い 長 TMP []、int型 RT、int型の L、int型R){ 38 TMP [RT] = INF。 39 であれば(L == R){ 40 リターン。 41 } 42 INT半ば=(L + R)/ 2 。 43 ビルド(TMP、室温* 2 、L、MID)。 44 ビルド(TMP、室温* 2 + 1、中間+ 1 、R)。 45 // push_up(TMP、RT)。 46 } 47 48 長い 長いクエリ(長い 長 TMP []、INT RT、INT L、INT R、INT QL、INT QR){ 49 であれば(QL <= L && R <= QR)戻りTMP [RT]。 50 INT半ば=(L + R)/ 2 。 51 であれば(QR <= MID)戻りクエリ(TMP、室温* 2 、L、中間、QL、QR)。 52 他に あれば(QL>ミッド)リターンクエリ(TMP、RT * 2 + 1、ミッド+ 1 、QL、R、QR)。 53 他{ 54 長い 長い ans_ls =クエリ(TMP、RT * 2 、L、中間、QL、QR)。 55 長い 長い ans_rs =クエリ(TMP、RT * 2 + 1、中間+ 1 、QL、R、QR)。 56 戻り分(ans_ls、ans_rs)。 57 } 58 } 59 60 空隙更新(長い 長 TMP []、int型 RT、int型の L、int型の R、int型 P、長い 長いX){ 61 であれば(L == R){ 62 TMP [RT] =のX。 63 リターン; 64 } 65 INT半ば=(L + R)/ 2 。 66 であれば(p <= MID)更新(TMP、RT * 2 、L、中、P、X)。 67 他の更新(TMP、室温* 2 + 1、中間+ 1 、R、P、X)。 68 push_up(TMP、RT)。 69 } 70 71 INT メイン(){ 72 のscanf(" %D%dの"、&N&K)。 73 のscanf(" %sの"、STR + 1 )。 74 ビルド(tree_no、1、1 、N) 75 ビルド(tree_yes、1、1 、N) 76 DP [N] [ 1 ] = INF。DP [0 ] [ 0 ] = 0 。 77 のために(int型 i = 1 ; iが<= N; iが++ ){ 78 場合(I> 1)DP [I] [ 0 ] =分(DP [I - 1 ] [ 0 ] + I、クエリ(tree_yes、1、1、N、I - K、I - 1 ))。 79 他の DP [I] [ 0 ] = I。 80 更新(tree_no、1、1、N、I、DP [I] [ 0 ])。 81 であれば(STR [I] == '1 ' ){ 82 であれば(I K - <= 1)DP [I] [ 1 ] = I。 83 他の 場合(I> 1)DP [I] [ 1 ] =分(クエリ(tree_yes、1、1、N、I - K、I - 1 )、 84 クエリ(tree_no、1、1、nは、I - K - 1、I - 1))+ I。 85 更新(tree_yes、1、1、N、I、DP [I] [ 1 ])。 86 } 87 } 88 のprintf(" %LLDする\ n "、分(DP [n]を[ 1 ]、DP [n]が[ 0 ])); 89 リターン 0 ; 90 }
参考ブログ:https://blog.csdn.net/qq_41730082/article/details/101119577