答えを 以下にできるかを判定することを考える。
元の値を変更せずに残す位置を とする。連続する 2 つの残す位置が なら、
が必要である。この条件は十分でもある。両端の値の差が 以下なら、その間の変更する要素を、1 ステップごとの差が高々 になるように整数で埋められる。先頭側と末尾側の変更区間も常に埋められる。
よって、元の値を少なくとも 個残せるかを判定すればよい。
サブタスク 4:
を、位置 を最後に残す位置としたとき、残せる元の値の個数の最大値とする。位置 とともに残せる前の位置 を直接調べると、
となる。条件を満たす がない場合、最大値は とする。
の順に計算し、 かどうかを確認する。1 回の判定は であり、二分探索と組み合わせると時間計算量は 、空間計算量は となる。
各位置 について
と定義する。 に対して、上の条件は
と同値である。
点 を の降順に並べ、 が等しい場合は の昇順に並べる。この順序で の最長非減少部分列の長さを とする。すると は同時に残せる元の要素数の最大値に等しい。
のとき なので、2 つの座標条件を満たす点の順序は元の添字順序とも一致する。 のときは であり、 の降順に並べた後の非減少部分列に同時に入れる異なる位置は同じ値を持つ場合だけなので、やはり正しい。
したがって のとき、かつそのときに限り は可能である。最長非減少部分列は upper_bound を使って で求められる。
可能性は に関して単調であるため、 から元の数列の最大隣接差まで二分探索する。全体の時間計算量は 、ここで である。メモリ計算量は である。
Solution written by GPT6