题目链接:海底高铁 - 洛谷
思路:利用前缀和计算出每段路要走的次数,根据次数分别计算这段路选ic卡的费用和直接买票的费用,选择花费少的。
注意点:每次操作将a[i]到a[i+1]之间的路的通过次数都加1,需判断a[i]和a[i+1]的大小。
#include<iostream>
using namespace std;
typedef long long ll;
const int MAXN=100005;
ll a[MAXN];
ll b[MAXN];
ll ans=0;
ll A,B,C;
int main()
{
//freopen("D:\\p3406_1.in","r",stdin);
int n,m;
int u,v;
cin>>n>>m;
for(int i=1;i<=m;++i)
{
cin>>a[i];
}
for(int i=1;i<m;++i)
{
u=max(a[i],a[i+1]);
v=min(a[i],a[i+1]);
b[v]++;
b[u]--;
}
for(int i=1;i<=n;++i)
{
b[i]+=b[i-1];
}
for(int i=1;i<n;++i)
{
cin>>A>>B>>C;
ans+=min(A*b[i],B*b[i]+C);
}
cout<<ans<<endl;
return 0;
}