Problem:


鉄道旅行 (Railroad Trip)

JOI 国には N 個の都市があり，それぞれ 1, 2, . . . , N の番号が付けられている．また，鉄道が N − 1 本あり，それぞれ 1, 2, . . . , N − 1 の番号が付けられている．鉄道 i (1 ≤ i ≤ N − 1) は，都市 i と都市 i + 1 を双方向に結んでいる．

JOI 国の鉄道に乗車する方法として，紙の切符で乗車する方法と，IC カードで乗車する方法がある．

 鉄道 i に紙の切符で乗車する場合の運賃は Ai 円である．

 鉄道 i に IC カードで乗車する場合の運賃は Bi 円である．ただし，IC カードで鉄道 i に乗車するには，鉄道 i で使える IC カードを事前に購入しておく必要がある．鉄道 i で使える IC カードを購入するには Ci 円かかる．一度購入した IC カードは，何度でも使用することができる．

IC カードの方が金額の処理が簡単になるため，IC カードで乗車する場合の運賃の方が紙の切符で乗車する場合の運賃よりも安い．すなわち， i = 1, 2, . . . , N − 1 に対して， Ai > Bi が成り立つ．IC カードの仕様は鉄道ごとにすべて異なるため，どの i に対しても，鉄道 i で使える IC カードを他の鉄道で使用することはできない．

あなたは，JOI 国じゅうを旅行することにした．都市 P1 から出発し，P2, P3, . . . , PM の順に都市を訪れる予定である．旅行は M − 1 日間の行程からなる．j 日目 (1 ≤ j ≤ M − 1) に都市 Pj から都市 Pj+1 に鉄道で移動する．この際，いくつかの鉄道を乗り継いで移動することもある．また，同じ都市を二度以上訪れることがあるかもしれない．JOI 国の鉄道は速いので，どの都市からどの都市へも 1 日で移動することができる．

あなたは現在，どの鉄道の IC カードも持っていない．あなたは，あらかじめ，いくつかの鉄道の IC カー
ドを購入し，この旅行にかかる金額，すなわち，IC カード購入費用と乗車した鉄道の運賃の和をできるだけ少なくしたい．

課題

JOI 国の都市の数，旅行の行程，および JOI 国のそれぞれの鉄道の運賃と IC カードの価格が与えられる．このとき，旅行にかかる金額の最小値を求めるプログラムを作成せよ．

入力

標準入力から以下のデータを読み込め．

 1 行目には，整数 N, M が空白を区切りとして書かれている．これらはそれぞれ，JOI 国に都市が N 個あり，旅行が M − 1 日間の行程からなることを表す. 

 2 行目には，M 個の整数 P1, P2, . . . , PM が空白を区切りとして書かれている．これらは，j 日目 (1 ≤ j ≤ M − 1) に都市 Pj から都市 Pj+1 に鉄道で移動することを表す．

 続く N − 1 行のうちの i 行目 (1 ≤ i ≤ N − 1) には，3 つの整数 Ai, Bi, Ci が空白を区切りとして書かれている．これらはそれぞれ，鉄道 i に紙の切符で乗車したときの運賃が Ai 円，IC カードで乗車したときの運賃が Bi 円，鉄道 i で使える IC カードの金額が Ci 円であることを表す．

出力

標準出力に，旅行にかかる金額の最小値を円単位で表す整数を 1 行で出力せよ．

制限

すべての入力データは以下の条件を満たす．

 2 ≤ N ≤ 100 000． 

 2 ≤ M ≤ 100 000．

 1 ≤ Bi < Ai ≤ 100 000 (1 ≤ i ≤ N − 1)．

 1 ≤ Ci ≤ 100 000 (1 ≤ i ≤ N − 1)．

 1 ≤ Pj ≤ N (1 ≤ j ≤ M)．

 Pj &ne; Pj+1 (1 ≤ j ≤ M − 1). 

入出力例

入力例 1

4 4
1 3 2 4
120 90 100
110 50 80
250 70 130

出力例 1

550

この場合，旅行にかかる金額を最小にする方法は以下のとおりである．

 鉄道 2 と鉄道 3 の IC カードを購入する．これには 80 + 130 = 210 円かかる．

 1 日目に，都市 1 から都市 2 まで紙の切符を使って移動し，次に都市 2 から都市 3 まで IC カードを使って移動する．これには 120 + 50 = 170 円かかる．

 2 日目に，都市 3 から都市 2 まで IC カードを使って移動する．これには 50 円かかる．

 3 日目に，都市 2 から都市 3 まで IC カードを使って移動し，次に都市 3 から都市 4 まで IC カードを使って移動する．これには 50 + 70 = 120 円かかる．

このように移動すると，旅行にかかる金額の合計は 210 + 170 + 50 + 120 = 550 円となる．これが最小であるので，550 と出力する．

入力例 2

8 5
7 5 3 5 4
12 5 8
16 2 1
3 1 5
17 12 17
19 7 5
12 2 19
4 1 3

出力例 2

81

問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。



Sample input:
4 4
1 3 2 4
120 90 100
110 50 80
250 70 130


Sample output:
550

Submission status: Accepted

Solution code:
import itertools

def main():
  n, m = map(int, input().split())
  plst = tuple(map(int, input().split()))
  abclst = [tuple(map(int, input().split())) for _ in range(n - 1)]
  
  sec = [0] * n
  for pi, pi1 in zip(plst, plst[1:]):
    p1, p2 = min(pi, pi1) - 1, max(pi, pi1) - 1
    sec[p1] += 1
    sec[p2] -= 1
  
  sec = tuple(itertools.accumulate(sec))
  
  ans = 0
  for i in range(n - 1):
    a, b, c = abclst[i]
    s = sec[i]
    ans += min(a * s, b * s + c)
  print(ans)
  
main()

Submission status: Accepted

Solution code:
n,m=map(int,raw_input().split())
p=map(int,raw_input().split())
abc=[map(int,raw_input().split()) for _ in xrange(n-1)]
cnt=[0]*n

for i in xrange(m-1):
    p[i]-=1
    p[i+1]-=1
    if p[i]<p[i+1]:
        cnt[p[i]]+=1
        cnt[p[i+1]]-=1
    else:
        cnt[p[i]]-=1
        cnt[p[i+1]]+=1
    p[i]+=1
    p[i+1]+=1
    
for i in xrange(n-1):
    cnt[i+1]+=cnt[i]
    
ans=0
for i in xrange(n-1):
    ans+=min(abc[i][0]*cnt[i],abc[i][1]*cnt[i]+abc[i][2])
    
print(ans)

Submission status: Accepted

Solution code:
n,m=map(int,input().split())
u=[0]*n
a=list(map(int,input().split()))
b=a[0]-1
for x in a[1:]:
    x-=1
    u[max(b,x)]-=1
    u[min(b,x)]+=1
    b=x
ans=0
for i in range(n-1):
    u[i+1]+=u[i]
    d,b,c=map(int,input().split())
    ans+=min(d*u[i],b*u[i]+c)
print(ans)

Submission status: Accepted

Solution code:
class Bit:
    def __init__(self, n):
        self.size = n
        self.tree = [0] * (n + 1)

    def sum(self, i):
        s = 0
        while i > 0:
            s += self.tree[i]
            i -= i & -i
        return s

    def add(self, i, x):
        while i <= self.size:
            self.tree[i] += x
            i += i & -i


n, m = map(int, input().split())
bit = Bit(n + 1)
cities = map(int, input().split())
prev = next(cities)
for cur in cities:
    if prev < cur:
        bit.add(prev, 1)
        bit.add(cur, -1)
    else:
        bit.add(cur, 1)
        bit.add(prev, -1)
    prev = cur

ans = 0
for i in range(1, n):
    a, b, c = map(int, input().split())
    bep = c // (a - b)
    cnt = bit.sum(i)
    if cnt > bep:
        ans += b * cnt + c
    else:
        ans += a * cnt
print(ans)

Submission status: Accepted

Solution code:
from itertools import accumulate

n, m = map(int, input().split())
cnts = [0] * (n + 1)
cities = map(int, input().split())
prev = next(cities)
for cur in cities:
    if prev < cur:
        cnts[prev] += 1
        cnts[cur] -= 1
    else:
        cnts[cur] += 1
        cnts[prev] -= 1
    prev = cur
cnts = list(accumulate(cnts))
ans = 0
for i in range(1, n):
    a, b, c = map(int, input().split())
    bep = c // (a - b)
    cnt = cnts[i]
    if cnt > bep:
        ans += b * cnt + c
    else:
        ans += a * cnt
print(ans)

Submission status: Accepted

Solution code:
# AOJ 0614: Railroad Trip
# Python3 2018.7.4 bal4u

import sys
from sys import stdin
input = stdin.readline

n, m = map(int, input().split())
p = list(map(int, input().split()))
tbl = []
for i in range(n-1):
	a, b, c = map(int, input().split())
	tbl.append((a, b, c))
f = [0]*n
for i in range(m-1):
	u, v = p[i]-1, p[i+1]-1
	if u > v: u, v = v, u
	f[u] += 1
	f[v] -= 1
for i in range(n-1): f[i+1] += f[i]
ans = 0
for i in range(n-1):
	cash = tbl[i][0] * f[i]
	ic = tbl[i][1] * f[i] + tbl[i][2]
	ans += min(cash, ic)
print(ans)

Submission status: Accepted

Solution code:
N,M = map(int,input().split())
P = list(map(int,input().split()))
cs = [0] * N
prices = []
# paper,ic,事前購入
for _ in range(N-1):
  prices.append(list(map(int,input().split())))

for i in range(M-1):
  cur = P[i]
  nxt = P[i+1]
  cs[min(nxt-1, cur-1)] += 1
  cs[max(nxt-1, cur-1)] -= 1  

for i in range(N-1):
  cs[i+1] += cs[i]

res = 0
for i in range(N-1):
  times = cs[i]
  a,b,c = prices[i]
  res += min(a*times, b*times+c)
print(res)

Submission status: Runtime Error

Solution code:
n,m=map(int,raw_input().split())
p=map(int,raw_input().split())
abc=[map(int,raw_input().split()) for _ in xrange(n-1)]
cnt=[0]*(n-1)
for i in xrange(m-1):
    p[i]-=1
    p[i+1]-=1
    if p[i]<p[i+1]:
        for j in xrange(p[i],p[i+1]):
            cnt[j]+=1
    else:
        for j in xrange(p[i],p[i+1],-1):
            cnt[j-1]+=1
    p[i]+=1
    p[i+1]+=1

ans=0
for i in xrange(n-1):
    ans+=min(abc[i][0]*cnt[i],abc[i][1]*cnt[i]+abc[i][2])
print(ans)