DOJ logoDOJ
問題
最近追加された問題保存した問題Workbooks
カテゴリDLCコンテストグループチーム掲示板
ランキング
正解数ランキングストリークランキングDOJ Powerランキング
提出状況
問題募集ログイン新規登録
DOJ logoDOJ

OI形式のサブタスク採点、Eloレーティング、Discord認証を備えたオンラインジャッジです。

問題
問題一覧カテゴリ
コミュニティ
コンテストランキング掲示板お知らせ外部のコンテストを開催するガイド
アカウント
ログイン新規登録ジャッジ状態
ポリシー
利用規約DLCの利用規則プライバシーAPI 文書言語ランタイムコンテストの順位報酬レーティングとパフォーマンス
© 2026 DOJ
All rights reserved
解説

Shiroganeは歌いたい

問題に戻る

解説

誤差の合計が EEE 以下なので、各項も ∣Ai−Bi∣≤E|A_i-B_i|\le E∣Ai​−Bi​∣≤E を満たす。0≤Ai≤500\le A_i\le500≤Ai​≤50 かつ Bi≥0B_i\ge0Bi​≥0 なので、取り得る音の高さは L=0L=0L=0 から U=50+EU=50+EU=50+E までに収まる。この範囲の整数の個数は W=51+E≤101W=51+E\le101W=51+E≤101 である。

Di(e,x)D_i(e,x)Di​(e,x) を、最初の iii 項を決めたとき、誤差の合計が ちょうど eee で、最後の音の高さ BiB_iB が である数列の個数とする。、 の状態を保存する。

最初の音の高さは B1=0B_1=0B1​=0 に固定されるので、その誤差は A1A_1A1​ である。A1≤EA_1\le EA ならば

D1(A1,0)=1D_1(A_1,0)=1D1​(A1​,0)=1

と初期化し、それ以外の状態は 000 とする。A1>EA_1>EA1​>E ならば有効な数列は存在しないため、直ちに 000 を出力してよい。

ここで i≥2i\ge2i≥2 とし、最後の音の高さを xxx に決める。この項の誤差は d=∣Ai−x∣d=|A_i-x|d=∣Ai​−x∣ なので、最初の 項の誤差の合計は でなければならない。直前の音の高さ は を満たす必要があるため、 のとき

Di(e,x)=∑y=max⁡(L,x−K)min⁡(U,x+K)Di−1(e−d,y)D_i(e,x)=\sum_{y=\max(L,x-K)}^{\min(U,x+K)}D_{i-1}(e-d,y)Di​(e,x)=

となる。e<de<de<d の状態の値は 000 である。

i=2,3,…,Ni=2,3,\ldots,Ni=2,3,…,N の順に、各誤差 eee と最後の音の高さ xxx を調べ、上の範囲の yyy を 直接列挙して 足し合わせればよい。すべての加算は 1 で割った余りで計算する。

最終的な答えは

∑e=0E∑x=LUDN(e,x)\sum_{e=0}^{E}\sum_{x=L}^{U}D_N(e,x)e=0∑E​x=L∑U​

である。誤差がちょうど EEE の状態だけを数えるのではなく、EEE 以下のすべての状態を足し合わせる。

状態数は N(E+1)WN(E+1)WN(E+1)W 個であり、各状態で直前の音の高さを最大 2K+12K+12K+1 個調べる。したがって、時間計算量は

O(N⋅W⋅(E+1)⋅(2K+1))O\bigl(N\cdot W\cdot(E+1)\cdot(2K+1)\bigr)O(N⋅W⋅(E+1)⋅(2K+1))

である。これは 要素数 × 音の高さの範囲 × 総誤差の範囲 × 隣り合う音の高さの差の範囲 に対応する。与えられた制約では、この遷移を直接計算できる。

各段階では直前の段階だけを使うので、配列は2層分だけ保存すればよい。空間計算量は O(W(E+1))O(W(E+1))O(W(E+1)) である。音の高さ xxx を配列の添字 x−Lx-Lx−L に対応させればよい。

証明

最初の項は 000 に一意に定まり、その誤差は A1A_1A1​ である。したがって、A1≤EA_1\le EA1​≤ のときに とする初期化は、長さ の有効な数列をちょうど一度数える。 の場合、後続の項を決めても誤差の合計は減らないので、答えは である。

Solution written by GPT6

i​
xxx
0≤e≤E0\le e\le E0≤e≤E
L≤x≤UL\le x\le UL≤x≤U
1​
≤
E
i−1i-1i−1
e−de-de−d
yyy
∣x−y∣≤K|x-y|\le K∣x−y∣≤K
e≥de\ge de≥d
y
=
max
(
L
,
x
−
K
)
∑
min(U,x+K)
​
Di−1​
(
e
−
d,y)
 000 000 0071\,000\,000\,007
1000000007
DN​
(
e
,
x
)
E
D1(A1,0)=1D_1(A_1,0)=1D1​(A1​,0)=1
111
A1>EA_1>EA1​>E
000

Di−1D_{i-1}Di−1​ が正しいと仮定する。最後の音の高さが xxx で、誤差の合計が eee である有効な数列から最後の項を取り除くと、誤差が e−∣Ai−x∣e-|A_i-x|e−∣Ai​−x∣ で、最後の音の高さ yyy が ∣x−y∣≤K|x-y|\le K∣x−y∣≤K を満たす数列が残る。

逆に、このような数列の末尾に xxx を付け加えると、隣り合う音の高さの差に関する条件を満たし、誤差の合計はちょうど eee となる。この2つの操作は互いに逆なので、遷移は有効な数列を漏れなく、重複なく数える。最後に e≤Ee\le Ee≤E の状態をすべて足し合わせれば、求める答えが得られる。