AtCoder Regular Contest 070 E - NarrowRectangles
考察してて生えてきた図に既視感があると思ったら、以前諦めて解説だけ見た問題だった
解法
というDPについて考えます。以下が成り立ちます。
ここまでで部分点が取れます。
実はは、傾きが段階的に変化するU字状の関数になっており、傾きが変わる点の集合をとして管理することができます。具体的には、
- 傾きのところから点を左右に分け、左側を降順、右側を昇順のpriority_queueとして持つ。左右それぞれで点同士の相対位置が正しくなるようにする。傾きの線の両端の点だけ正しい座標を持っておく。
- 漸化式の第1項を処理することを考える。傾きの線が広がることがわかるので、両端の点の座標を更新する。
- 漸化式の第2項を処理することを考える。ある点で傾きが変わることがわかるので、priority_queueに同じ点を2つ追加し、左右間で点を受け渡す。座標と答えを更新する。
とすればよいです。
計算量はとなり、満点が得られます。
反省
解説だけ見たものも意外と覚えているらしく、割とすんなりACできました。
データ構造を持ってDPのオーダーを落とすというのは初めてやったように思います。こういうのもあると心の片隅に置いておきます。