けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

Codeforces Round 892 (Div. 2) D. Andrey and Escape from Capygrad (R??00)

区間を整理する考え方が楽しかった。

問題概要

下図のように  N 組の「黒い区間」と「赤い区間」がある。赤い区間は黒い区間に完全に包含されている。

この区間上でコマを動かしていく。コマが  i 番目の黒い区間の内部にあるとき、 i 番目の赤い区間の内部の任意の点にコマを移動できる。

 Q 個のクエリが与えられる。各クエリでは、コマの初期位置  x が与えられる。上記のルールに則ってコマを動かすとき、コマの位置の最大値を答えよ。

制約

  •  1 \le N \le 2 \times 10^{5}
  • クエリの個数はテストケース全体を通して  2 \times 10^{5} 以下である

考えたこと

色々単純化してよいことがわかった。

 i 番目の黒い区間が  \lbrack l_{i}, r_{i} \rbrack、赤い区間が  \lbrack a_{i}, b_{i} \rbrack とするとき、次のように単純化してよい。

  • コマの座標  x x \le l_{i} ならば、 x b_{i} に移動できると考えてよい (右端が存在しないとしても変わらない)
  • コマを移動させるとき、赤い区間の右端以外に動かす場合は考えなくてよい

これだけ単純化すれば、次の DP ができる。なお、各区間を黒い区間の左端の順にソートしておくこととする。


dp[i] i 番目の黒い区間の左端から出発して到達できる地点の最大値


コード

codeforces.com