公式

C - 川を行くボート / A Boat Going Down the River 解説 by harurun4635


まずは、ボートの速度を求め、これを \(U_i\) としましょう。これで川は無視することができます。

川の流れが変わらない間は、速度は一定ですから

  • 直前に速度が切り替わった時刻 \(T_i\)
  • 直前に速度が切り替わった時の座標
  • 今の速度 \(U_i\)

が分かれば数式で今の位置を求めることができます。

これらは、与えられた情報から求めることができます。具体的には二分探索をもちいることで、

  • \(T_j \le X_i\) を満たす最大の \(j\)

を求めれば、これが直前に切り替わった時の時刻で、これから他の情報もわかります。


実装例

from bisect import bisect_right
n, v, q = map(int, input().split())

ts = [0]
xs = [0]
us = [0]

x = 0
for i in range(n):
    t, w = map(int, input().split())
    x += (t - ts[-1]) * us[-1]
    
    if w > 0: w += v
    elif w < 0: w -= v
    
    ts.append(t)
    xs.append(x)
    us.append(w)

for i in range(q):
    x = int(input())
    j = bisect_right(ts, x) - 1
    print(xs[j] + (x - ts[j]) * us[j])

投稿日時:
最終更新: