南昌のネットワークゲームは、元のタイトルのCFであります
、次のように深刻な、クエリ[L、R]にそれぞれの時間は、このセクションの要件は、この問題を行うことが最初にそこ2017個のシーケンスがありますが、番号2016の配列を有することができない最小の要素を削除する必要があります
まず、我々は短い間隔せれば[L、R]は次いで明らか単純な三次元DPがある行うことができ、状態0 | 1 | 2 | 3 | 4はキーワードを表しておらず、2 21、あり、201は、あります2017年の場合、DPがある[i] [j]はiを除去するために必要なJの最小値を述べるために状態から文字遷移を表します
次いで明確場合、S [I] = 6、[3] [3] = 1、DPは、[4]がDP [4] = 1
結合状態が良好であることが分かる、区間[L、中間]及び区間[中間+ 1、R]のために、状態DP1の前半、状態は共にDP2二つのセクションの半分であることを条件とする,,状態DP [L] [R]、そこDP1 [L] [K] + DP [K] [R]はDP [L] [R]を=
すべての州我々は、どんな複雑な部分を追求するために直接パーティションを使用することができますので、より多くの時間が速いので、十分にあるので、O(125 / 6nlogn)であります
#include <ビット/ STDC ++ H.> 使用して 名前空間STD; の#define N 200005 の#define 0x3f3f3f3f INF チャー; S [N] INT N-、Q; ボイド準備(INTの L、INT R&LT){ int型 I = L、J = R&LT ; 一方、(私は< J)を{ スワップ(S [I]、S [J]); ++ I、 - J; } } // 状態0が何を表していない、1が状態2を示し、状態2は、20を表します。 201は状態4は2019、DP [I] [J示し、状態3を示す ] 意味I-> Jコスト // セグメントツリーを有する隣接セグメントmergability状態と各セグメントは、マージパーティション情報を維持すると考えられているため、セグメントツリー[L、R]メンテナンス[L、R] N ^ DP転送部3と同様、すべての状態のコスト、組み合わされたときに 構造体ノード{ int型 DP [5 ] [ 5 ]。 ノード(){ memsetの(DP、0x3fを、はsizeof DP)。 } } SEG [N << 2 ]。 #define LSONのL、M、RT << 1つ の#define rsonのM + 1、R、RT << 1つの| 1つの ノードマージ(ノード、ノードB){ ノードRES。 用(int型、L = 0 ; L < 5 ; L ++ ) のための(INTの R = 0 ; R < 5 ; R ++ ) のための(int型のk = 0 ; K < 5 ; kは++) res.dp [L] [R] =分(res.dp [L] [R]、a.dp [L] [K] + b.dp [K] [R])。 リターンのres; } ボイドビルド(int型 L、INT R、INT RT){ 場合(L == R){ ため(int型 I = 0 ; iが< 5 ; iが++ ) SEG [RT] .DP [i]は[I] = 0 ; もし(S [L] == ' 2 ' ){ SEG [RT] .DP [ 0 ] [ 0 ] = 1 ; SEG [RT] .DP [ 0] [ 1 ] = 0 。 } そうで あれば(S [L] == ' 0 ' ){ 自体[RT] .DP [ 1 ] [ 1 ] = 1 ;アウト[RT] .DP [ 1 ] [ 2 ] = 0 ; } そうで あれば(S [L] == ' 1 ' ){ 自体[RT] .DP [ 2 ] [ 2 ] = 1 ;アウト[RT] .DP [ 2 ] [ 3 ] = 0 ; } そうで あれば(S [L] ==' 9 ' ){ 自体[RT] .DP [ 3 ] [ 3 ] = 1 ;アウト[RT] .DP [ 3 ] [ 4 ] = 0 ; } そうで あれば(S [L] == ' 8 ' ){ 自体[RT] .DP [ 3 ] [ 3 ] = 1 ;アウト[RT] .DP [ 4 ] [ 4 ] = 1 。 } を返します。 } のInt M = 1 + rを>> 1 。 (rson)、(LSON)の構築構築。 アウト[RT]=マージ(SEG [RT << 1 ]、SEG [RT << 1 | 1 ])。 } ノード・クエリ(int型 L、INT R、int型の L、INT R、INT RT){ 場合(L <= 1 && R> = R)戻りSEG [RT]。 INT、M = 1 + rを>> 1 。 ノードのres; 以下のために(int型 i = 0 ; iは< 5 ; iは++)res.dpを[I] [I] = 0 ; もし(L <= M)RES = (RES、クエリ(L、R、LSON))をマージします。 場合(R> M)のRES =は(RES、クエリ(L、R、rson))マージ。 リターンのres; } int型のmain(){ CIN >> N >> Q。 scanf関数(" %sの"、S + 1 )。 リザーブ(1 、N) (ビルド1、nは、1 )。 一方、(q-- ){ int型のL、R。 scanf関数(" %dの%のD "、&L&R)。 L = N-L + 1 ; R = N-R + 1 。 ノードRES =クエリ(R、L、1、nは、1 )。 もし(res.dp [ 0 ] [ 4 ] == INF) プット(" -1 " )。 他 COUT << res.dp [ 0 ] [ 4 ] << ENDL。 } }