[2019ハング電動マルチ第十校フィールド] [hdu6701] Rounddogハッピーメイク

トピックへのリンク: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 }

 

おすすめ

転載: www.cnblogs.com/sainsist/p/11414393.html