Codeforces Round #669 (Div. 2) D. Discrete Centrifugal Jumps
この問題難しくね?
ちょっと理解が足りてないのでふわっとした説明になってます。
気づき
- min max の要素数が小さいのなら場合分けをしてみる(今回は4パターン)
- 場合分けをすることで、インデックスに対して、移動できる位置を(場合分けの条件下で)1つに限定できる
……どうやって思いつくんでしょうね?
いろいろ手を動かすと、下に凸なビル群で、移動する両端のインデックスを,と置いたとき、からの移動先が一つに限定できるパターンと、からの間にが存在して、からへと移動できて、からの移動先が一つに定まらいパターンがあることがわかる。
どういったときにからの移動先を一つに限定できるかというと、
かつ のときに、から移動先は唯一に定まる。
( なので、以上は存在しない)
逆に、 かつ のとき、からの移動先は の間に存在し得る。( にたいして、 かつ が存在できる)
このとき、視点を変えることで、問題をシンプルにすることができる。つまり、からへの移動ではなく、へ移動してくる移動元を考える。すると、 のとき、へ移動してくる移動元はの唯一に定まる。
同様にして、上に凸の場合も考えると、結局移動先(移動元)は4パターンあり、
(上記に加えての場合も考慮する必要がある)
任意のインデックスにたいして、
- (下に凸)のとき、より右側にある、最初の以上のビル
- (下に凸)のとき、より左側にある、最初の以上のビル
- (上に凸)のとき、より右側にある、最初の以下のビル
- (上に凸)のとき、より左側にある、最初の以下のビル
が移動先(移動元)となる。
(当然への移動を忘れないように)
以上からグラフをつくってDPか最短経路で問題は解ける。
移動先を求めるのは、セグメントツリーに対する二分探索が使える。
境界条件でバグりやすいので注意。
公式解説はstackを利用して頭がよいので、できれば理解しておきたい。