解题思路:首先想到的是把每一段路经过的次数记录下来,最后使用贪心的思想去找到哪一种方式更省钱即可,但是这样暴力的去对每一个区间进行加一操作会超时,使用差分数组和前缀和即可快速计算每一段路的情况。
差分数组概念
代码如下:
#include<bits/stdc++.h>
#define MAX 100001
using namespace std;
using gg = long long;
gg n,m;
gg cf[MAX];//差分数组
gg res=0;
struct node
{
gg val;//单程费用
gg ic_val;//办卡之后的费用
gg ic;//办卡的费用
};
node nd[MAX];//每一段路的情况
int main()
{
cin>>n>>m;
gg x,y;
cin>>x;
for(int i=1;i<m;i++)
{
cin>>y;
if(x<y)
{
cf[x]+=1;
cf[y]-=1;
}
else
{
cf[y]+=1;
cf[x]-=1;
}
x=y;
}
for(gg i=1;i<n;i++)
{
cin>>nd[i].val>>nd[i].ic_val>>nd[i].ic;
}
gg sum = 0;
for(int i=1;i<n;i++)
{
sum+=cf[i];
res +=(min(sum*nd[i].val,sum*nd[i].ic_val+nd[i].ic));
}
cout<<res<<"\n";
return 0;
}