多くの考えを感じて実現可能な解決策、そして無謀な暴力(FSTと逃げる私はこのブログの脱出を削除
#include <ビット/ STDC ++。H> の#defineは LL長い長 の#define LD長い二 の#define ULL符号なし長い長 の#define第Fiの に#define SE第二 の#define MK make_pair の#define PLL対<LL、LL> の#define PLI対<LL、整数> の#define PII対<整数、整数> の#define SZ(X)((INT)x.size()) の#define ALL(X)(X).begin()、(X).END( ) の#define FIOイオス:: sync_with_stdio(偽); cin.tie(0)。使用して名前空間はstdを、CONSTのINT N = 5E5 + 7 。 const int型 INF = 0x3f3f3f3f 。 constの LL INF = 0x3f3f3f3f3f3f3f3f 。 const int型のmod = 998244353 ; constの ダブル EPS = 1E- 8 ; CONST ダブル PI = ACOS( - 1 )。 テンプレート < クラス T、クラス S>インラインボイド追加(T&、S b)は{A + B =。もし(A> = MOD)A - = MOD;} テンプレート < クラス T、クラス S>インラインボイドサブ(T&、S b)は、{ - = B。もし(<0)、A + = MOD;} テンプレート < クラス T、クラス S>インラインBOOL chkmax(T&、S B)は{ 返す <bは?= B、真:偽;} テンプレート < クラス T、クラス S>インラインブール chkmin(T&、S b)は{ 返す > bは?A = B、真:偽;} int型nは、[N]。 INT maxPos [N]。 int型マップ[N]; int型ログ[N]; 構造体ST { INT DP [N] [ 20]; int型のTY; ボイド(ビルド整数 nは、INT B []、INT {_Ty) TY = _Ty。 以下のために(int型 = Iを- (ログ[ 0 ] = - 1); iがNを<; I ++の) ログ[I] =ログイン[I - 1 ] +((I&(iは- 1))== 0 )。 以下のために(int型 iは= 1 ; iは= <N; iは++)DP [I] [ 0 ] = TYの*のBを[I]。 以下のための(int型 J = 1; J <=ログイン[N]。J ++ ) のために(int型 = Iを1、I +(1 << J) - 1 <= N; iは++ ) DP [I] [J] = MAX(DP [I]、[J- 1 ]、DP [iが+(1 < <(J- 1))] [J- 1 ])。 } インラインLLクエリ(int型のx、int型のY){ int型 K =ログイン[Y - X + 1 ]。 戻り TY * MAX(DP [X] [K]、DP [Y-(1 << K)+ 1 ] [K])。 } } RMQ。 INT {main()の scanf関数(" %のD "、&N) 以下のために(int型私= 1 ; iが<= N; iが++)のscanf(" %dの"、および[I])。 rmq.build(nは、1 )。 INT canGo = N。 以下のために(int型 I = N; I> = 1 ; i-- ){ 場合(地図[I])chkmin(canGoマップ[I]] - 1 )。 地図[[I]] = I; maxPos [I] = canGo。 } LL ANS = 0にとって; ;(int型 i = 1 ; iがn = <; iは++ ){ int型今= I。 一方、(今<= maxPos [I]){ 場合(rmq.query(I、今)==今- I + 1 ){ ANS ++ 。 今 ++ ; } 他{ 今 =私は(今)rmq.query + - 1 。 } } } のprintf(" %LLDする\ n " 、ANS)。 リターン 0 } / * * /