F - Hammer 2 Editorial by snuke

より高速な解法

壁ハンマーのペアについて

壁とハンマーの座標が両方正のとき、

  • \(Z_i \lt Y_i\) の場合:壁の前に必ずハンマーを通るため、この壁は無視して良い。
  • \(Y_i \lt Z_i\) の場合:壁を通ることは不可能。このタイプの壁の \(Y_i\) の最小値より外へは行けない、という扱いをすればいい。

両方負の場合も同様なので、以降は正負が逆(壁とハンマーが反対側)のものだけを考慮すれば良い。

O(N log N) 解法

原点~ゴール間にある壁に対応するハンマーの座標のうち最も遠いものを \(Z'\) とする。(上記の考察により \(Z'\) はゴールと反対側にある)

  • \(Z'\) には到達しなければならない
  • \(Z'\) に到達できれば、後は直接ゴールへ行けば良い

よってゴールが \(Z'\) だと思って問題を解き、\(|X-Z'|\) を足せば良い。

これを高々\(N\) 回繰り返し、原点~ゴール間に壁がない状態にできれば良く、ならなかったら循環参照みたいになってるので \(-1\)

座標のソート以外は線形で出来そう。
https://atcoder.jp/contests/abc273/submissions/35815852


解説放送でACしたコード、通れない壁の処理を「ゴールより近いなら-1、遠いなら無視」としてたので、以下のケースで落ちますね。
ハハ壁高壁ゴ みたいなの

2 2
1 -1
-2 -3

posted:
last update: