2019年4月22日月曜日

ABC 076 D - Atcoder Express

ABC 076 D - Atcoder Express

1秒ずつシミュレーションしていくことを考える。1秒ごとに、可能なら速度を1上げ、無理なら速度を維持し、それも無理なら1下げるというロジックを書くことになる。判定する上での問題は、次の境界の速度制限viv_iを達成することが可能だとしても、vi+1,vi+2,...v_{i+1}, v_{i+2}, ...も達成できるとは限らないことである。これを考慮に入れるためには、実際に可能な速度の上限viv'_iを末尾から求めていってviv_iの代わりに使えば良い: vi:=min(vi,vi+1+ti)v'_{i} := \min(v_{i}, v'_{i+1}+t_{i})。ただしvN+1:=0v'_{N+1}:=0

しかし、このままでは整数秒の中間で増減が切り替わるパターン(入出力例4)を扱えない。そこで、(ti)(t_i)(vi)(v_i)を最初からすべて2倍して求まった距離を4で割ることにする。

……という考察自体はすぐに終わったのだが、実装の段階で境界条件をひたすらにバグらせてしまった。ACした後も、何がポイントなのかいまいちわからない。後でほかの人のコードを読む。