PythonでJOI難易度5を埋める #15

A - 鉄道旅行 (Railroad Trip)

考えたこと
鉄道iii+1区間しか移動できないから,それぞれの鉄道に何回乗るかをカウントする. カウントしたらmin(鉄道iに乗る回数 \times 紙の切符の値段, 鉄道iの乗る回数 \times ICカードで乗る値段 + ICカード代をそれぞれの鉄道で計算するだけだが,鉄道iに何回乗るかをカウントするのがネックになる.
愚直に区間内の配列の値を+1すると,1→n→2 \cdotsみたいなときにO(NM)?になる可能性がある.そこで,累積和を用いて区間の最初と最後だけで更新できるように工夫する.
区間の最初を+1することによって後ろの全要素に+1したことになり,区間の最後を-1するとそれ以降の全要素を-1することになるので,区間内だけ+1することができる.

n, m =map(int, input().split())
p = list(map(int, input().split()))
ticket = [list(map(int, input().split())) for _ in range(n - 1)]

cnt = [0] * (n - 1)
for i in range(m - 1):
    tmp = list(sorted([p[i], p[i + 1]]))
    cnt[tmp[0] - 1] += 1
    if tmp[1] != n:
        cnt[tmp[1] - 1] -= 1

csum = [cnt[0]]
for i in range(1, n - 1):
    csum.append(cnt[i] + csum[i - 1])

ans = 0
for i in range(n - 1):
    ans += min(ticket[i][0] * csum[i], ticket[i][1] * csum[i] + ticket[i][2])

print(ans)