トピックへのリンク:http://acm.hdu.edu.cn/showproblem.php?pid=6701
満足$ maxのためにタイトルの効果(A_ {1}、A_ {L + 1} \ CDOT \ CDOT \ CDOT A_ {R}) - (R-L + 1)<=区間k $の数。
まず最大のプリアウト接頭辞と接尾辞テーブルSTと最大、その後、パーティション。
あなたは間隔のパーティションの最大範囲を得ることができますたびに、我々は間隔の最大値に期間法的最大の数を必要とします。
ここでは、左から、左または右端点が最大の電流範囲の位置によって決定された左端位置(右端点)法的セクションを列挙し、次に単純化を通じて正当な権利の点(左の点)を取得するために入力し、列挙を選択することができ最大左右端点である点は、右最大でも、そう列挙する側のより小さな数を選択しなければなりません。
1の#include <cstdioを> 2の#include <CStringの> 3の#include <アルゴリズム> 4の#include <iostreamの> 5の#include < 設定 > 6 使って 名前空間STD。 7 typedefの長い 長いLL。 8 typedefの符号なしの長い 長いULL。 9 のconst int型 MAXN = 3E5 + 110 。 10 INT [MAXN]、POS [MAXN]、L [MAXN]、R [MAXN]、ログ[MAXN]。 11 int型N、K。 12 int型 DP [MAXN] [ 20 ]。 13 int型の照会(int型 L、int型R){ 14 のint、K =ログイン[R - L + 1 ]。 15 であれば([DP [L] [K]]> [DP [R - (1 << K)+ 1 ] [K]) 16 リターンDP [L] [K]。 17 他 18 戻り DP [R - (1 << K)+ 1 ] [k]は、 19 } 20 LL DFS(INT L、INT R){ 21 であれば(L == r)は戻り - [L] 1 <= 、kは 22 場合(L> R)戻り 0 ; 23 int型 CNT = クエリ(L、R)。 24 LL ANS = 0 。 25 場合(CNT - L <R - CNT)は{ 26 のために(int型私はLを=;私は= CNTを<; Iは++ ){ 27個 のint LS = MAX( - K - CNT、iが[CNT + 1 )。 28 INT RS = 分(R、R [I])。 29 であれば(RS> =用LS) 30の ANS + = RS - LS + 1 。 31 } 32 } 33 他{ 34 のためには、(int型 I = CNTと、I <= R; iは++ ){ 35個 のint LS = MAX(L、L [I])。 36 INT RS =分(I - ([CNT] - K)+ 1 、CNT)。 37 であれば(RS> =用LS)ANS + = RS - LS + 1 。 38 } 39 } 40 リターン ANS + DFS(L、CNT - 1)+ DFS(CNT + 1 、R)。 41 } 42 INT メイン(){ 43 のint T。 44 のscanf(" %dの"、&T)。 45 一方(t-- ){ 46 のscanf(" %D%dの"、&N&K)。 47 のために(int型 i = 1 ; iが<= N; iが++ ) 48 のscanf(" %dの"、および[I])。 49 ログ[ 0 ] = - 1 。 50 のためには、(int型 i = 1 ; iがn = <; I ++の)ログ[I] =ログイン[I >> 1 ] + 1 。 51 のための(int型I = 1 ; I <= N。I ++ ) 52 DP [I] [ 0 ] = I。 53 のために(INT J = 1 ;(1 << J)<= nであり、j ++ ){ 54 のためには、(int型 i = 1 ; iが(+ 1 << J) - 1 <= N; iが++ ){ 55 であれば(Aを[DP [I]、[J - 1 ]]> [DP [I +(1 <<(j - 1))] [J - 1 ]) 56 DP [I] [J]がdp [I]を[= J - 1 ]; 57 他の 58 DP [I] [j]はDPを= [iが(+ 1 <<(j - 1))] [J - 1 ]。 59 } 60 } 61 のための(int型 I = 0 POS [I] = iは++; iがn = <)0 。 62 R [N + 1 ] = N。 63 のためには、(int型 I = N; I> = 1 ; i-- ){ 64 であれば(POS [I]]){ 65 R [I] = POS [I]] - 1 。 66台の POS [I] =私; 67 } 68 他{ 69 POS [[I] = I。 70 R [I] = N。 71 } 72 R [I] =分(R [i]は、R [I + 1 ])。 73 } 74 のための(int型 I = 0 POS [I] = iは++; iがn = <)0 。 75 のために(int型 i = 1 ; iが<= N iが++ ){ 76 であれば(POS [I]]){ 77 L [I] = POS [I] + 1; 78台の POS [I] = I。 79 } 80 他{ 81 POS [[I] = I。 82 L [I] = 1 。 83 } 84 L [I] = MAX(L [I]、L [I - 1 ])。 85 } 86 のprintf(" %LLDする\ n "、DFS(1 、N))。 87 } 88 }