質問の意味:
与えられた長さのn $ $列$ \ {A_N \} $の。
正の整数$ xには$を考えると、あなたは$ [L、R] $の範囲を指定する機会を持っているので、私forallは$ \は[L、R]、\に\;(、a_iを= a_iを+ dは\ | D | \ルX)$。
最長のサブシーケンスの長さが上昇し最大化することを求めます。
$ 1 \ルのn \ル2 \回10 ^ 5、\クワッド1 \ルa_iを、X \ル10 ^ 9 $と正の整数です。
分析:
あなたは簡単に3つのプロパティを見つけることができます。
一方のプロパティ:$ [1、L] $を減少させるために$ [L、R] $ない優れを低減する、$ [L、R] $しない優れたリフティングの$ [Lを、N] $を持ち上げます。
二つの特性は:$ [1、P] $は$ [P + 1、N] $を上げるに相当する減少しました。
3つのプロパティ:$ xに$を下げる/上げることなく$ K $よりも低下/上昇します。
したがって、答えの2つの部分に分け、その後、総答えを構成するシークを考えるのは簡単です。
しかし、これはスプリット・ポイントで結合/接尾辞最大の前にそれらの配列を拡張または増加させるため、単純に左/右ではありません。どのようにそれを行うには?
^すなわち、LIS $ $ $ $ a_iを時間が$ \ mathop {分} \制限が_ {J = + 1}を超えてはならない、いくつかの制限を行うことを検討するために、左から右へのn \ {a_j \} $ $参加するから、でLIS $。
それは貢献の多くを欠場するので、このアプローチは、明らかに間違っています。あなたがする「制限法」を使う、という場合は、$ iが$たびに移動し、更新を制限補正するように、すべては、前の時間を再計算しています。
ちょっと待って、私たちは問題外で考えていますか?とても複雑ありますか?
我々は何を求めている今、落ち着いてみましょうか?
いくつかの「左パズル」候補。
今は非現実的であるのに対して、「左のパズル」ことができ、すべての「右のパズル」を、追求しようとして「制限」。
だから我々が考慮すべきは、フィット「「パズル」の対応する長さを作成する方法です。」私たちは場所を見つけるために行くために$ a_iを$ $ $ LISの左に許可する必要があります。
仕様・ポイントを定義するには:
最長系列長を終了$ $ a_iを上昇下降するとき$ $ F_iとは、セットの$ [1、I-1] $を示しています。
法的位置のルN $ $ a_iを$単調な配列が$のf_i $ Aのときだから我々は単調な配列、$ 2 \ルI \に$ LIS $で、それぞれの$ a_iを-X $を行っています。
次いで答えは$最大\ {\ \ mathop {最大} \限界^ {N} _ {i = 2}であり、$ I $は$ L_iを$ときの長さが単調なアレイを提供し、$ LIS $を費やすことになる後\ {のf_i + L_iを\} \ ,, \、L_1の\ \} $。
実装(100):
#include <iostreamの> する#include <cstdioを> する#include <CStringの> する#include <cmath> の#include <アルゴリズム> の#define ILインライン 使用 名前空間STDを、 const int型 N = 2E5; const int型 INF = 0x3f3f3f3f 。 int型のn、X、[N + 3 ]。 INT [N + F 3 ]。 ILのブール CMP1(INT P、INT Q){ 戻り P> = Q。 } IL BOOL CMP2(INTP、int型Q){ 戻り p <= Q。 } ILのint型のビン(INT *、int型の L、int型の R、INT X、BOOL CMP(INT P、INT Q)){ int型ミッド、ANS = 0 。 一方、(L <= R){ 半ば =(L + R)>> 1 。 もし(CMP([中間]、X)){ ANS = ミッド。 R =半ば1 。 } 他 L=ミッド+ 1 ; } 戻りANS。 } int型のmain(){ freopenは(" glo.in "、" R " 、STDIN)。 freopenは(" glo.out "、" W " 、STDOUT)。 scanf関数(" %D%dの"、&N、&x)は、 以下のために(int型私= 1 ; iが<= N; iが++ ) のscanf(" %dの"、および[I])。 ]、K。 0x3fを、はsizeofのS) S [ 0 ] = - INF。K = 0 。 以下のために(int型 i = 1 ; iは= N <; iは++ ){ F [I] = MAX(0、ビン(S、1、K + 1、[i]は、CMP1) - 1 )。 INT P =ビン(S、1、K + 1、[I] - X、CMP1)。 S [pは] = [I] -x。K = MAX(K、P)。 } INT ANS。 memsetの(S、0、はsizeofのS) S [0 ] = INF。 kは = ANS = 0 。 以下のために(int型 I = N; I> = 1 ; i-- ){ int型 P =ビン(S、1、K + 1 、[I]、CMP2)。 S [pは] = [I]。K = MAX(K、P)。 ANS = MAX(ANS、P + F [I])。 } のprintf(" %dの" 、ANS)。 リターン 0 ; }
要約:
明らかに$帰化廃棄$ \ RIGHTARROW $ RIGHTARROW $ \の性質は、適切に答えを綴ります。