#587(DIV。3)FラウンドCodeforces。Wi-Fi

トピックへのリンク: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つの部屋のすべての最小コストでインターネットに接続している、 - 私は前に仮定

  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、11 、N)
75      ビルド(tree_yes、11 、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、11、N、I - K、I - 1 ))。
79          他の DP [I] [ 0 ] = I。
80          更新(tree_no、11、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、11、N、I - K、I - 1 )、 
 84                                            クエリ(tree_no、11、nは、I - K - 1、I - 1))+ I。
85              更新(tree_yes、11、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

おすすめ

転載: www.cnblogs.com/mrzhangziheng/p/11586178.html