式沈静化を書き出すために、開始することは不可能と思われます。
の要件を満たすために区間$ [I、J] $、条件:
$和[I] [1] -sum [J-1] [1] =和[I] [2] -sum [J-1] [2] $
$和[I] [1] -sum [J-1] [1] =和[I] [3] -sum [J-1] [3] $
...
$和[I] [1] -sum [J-1] [1] =和[I] [K] -sum [J-1] [k]は$
$和[i]は[J] $ $ $ $間隔の特性の中に$ [1、i]の数を表し、Jが表示されます
同じラベルの下に一緒に入れました:
$和[J-1] [2] -sum [J-1] [1] =和[I] [2] -sum [I] [1] $
$和[J-1] [3] -sum [J-1] [1] =和[I] [3] -sum [I] [1] $
...
$和[J-1] [K] -sum [J-1] [1] =和[I] [K] -sum [I] [K] $
$和限り、満足が見つかりました[I] [P] -sum [i]の[1] [1、k]は$でのp \ forallを合計[J] [P] -sum [J] [1]、\を=
直接ライン上の$マップ$メンテナンスに従事だから、私はああ、そう直接列挙裁判官のような構造を提唱し、状態$ハッシュ$が安定していないと感じ
プレフィックスとそうは$ 0 $が$地図$に参加置くことを忘れないことに注意してください!
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> する#include <cmath> の#include <地図> 使用して 名前空間STD。 typedefの長い 長いLL。 インラインint型リード() { int型のx = 0、F = 1。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = -1 ; CH = GETCHAR()。} 一方、(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)。CH = GETCHAR()。} 戻りのx *のF。 } のconst int型 N = 1E5 + 7 。 INTのN、K、ANS。 構造体DAT { INT [ 31 ]。 DAT(){memsetの(0、はsizeof (a)参照)。} インラインDAT F() { DAT RES。 以下のための(INT i = 1 ; iが= Kを<; iは++)res.aは[I] = [I] -a [ 1 ]。 リターンのres; } インラインブール 演算子 <(CONSTの DAT&TMP)のconst { ため(int型 i = 1 ; iは= Kを<; I ++の) 場合([I] = tmp.a [i]は!)を返す [I] < tmp.a [私]; リターン 0 ; } } C [N]、合計。 マップ <DAT、int型 > 融点; INT )(主 { N =(読み取り)、Kは=リード()。int型; 以下のために(int型 i = 1 ; iが<= N; iは++ ) { =は)(読み取ります。 用(INT J = 1 ; J <K = A >> = 1 C [I] .A [J] = A&、J ++)1 。 } MP [sum.F()] = 1 。 以下のために(int型 i = 1 ; iが<= N; iは++ ) { ための(int型 J = 1 ; J <= K; J ++)sum.a [J] + = C [i]は.A [J]。 DAT P = sum.F()。 もし(MP [P])ANS = MAX(ANS、I-(MP [P] - 1 ))。 他の MP [P] = I + 1 。 } のprintf(" %d個の\ n " 、ANS)。 リターン 0 ; }