
一、核心思路
行程是从 P1、P2...Pk,每一段都会经过若干段铁路。可以利用差分数组来统计每一段铁路(第Pi 段)在整个行程中被经过的总次数。对于每一段铁路Pi,我们可以独立决策是全部买纸质票,还是买一张 IC 卡后每次刷卡。
二·、代码实现
cpp
typedef long long LL;
const int N = 1e6;
int n, m;
LL f[N];
int x, y;
int main ()
{
cin >> n >> m;
// 构建差分数组
cin >> x; // 起始城市
for (int i = 2; i <= m; i++)
{
cin >> y;
if (x > y)
{
f[x]--;
f[y]++;
}
else
{
f[x]++;
f[y]--;
}
x = y;
}
// 前缀和还原原始数组表示各段城市间链路经过的次数
for (int i = 1; i <= n; i++) f[i] += f[i-1];
LL ret = 0;
for (int i = 1; i < n; i++)
{
int a, b, c; cin >> a >> b >> c;
ret += min(f[i] * a, c + b * f[i]);
}
cout << ret;
return 0;
}