1.本体运用了前缀和和差分
2.使用差分计算了每个站台之间走过了多少次。差分是在一个区间内加,或减一个数的方法
一般改变原数组,需要先把数组转换成差分数组,
而这里不需要再构建差分数组,因为原始的数组都为0,直接对差分数组进行操作即可
3.应为差分为前缀和的逆运算,最后要把差分数组求一遍前缀和,得到被改变的区间,也就是每个站台走过了多少次。
注意:这里的差分是对,站台区间进行操作,而本题i表示,i到i+1的路程,既是对n-1的区间进行的操作,最后求前缀和便是这样
步骤:1.创造差分数组,站台数组
2.遍历站台,对差分数组进行操作,这里b是一定要求大于a的,如果不是这样的话,用swap交换一下
3.对差分数组求前缀和
4.最后比较费用大小
#include <iostream>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n,m;
ll p[N],d[N];
void init(int x,int y){
d[x]+=1,d[y]-=1;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)cin>>p[i];
for(int i=2;i<=m;i++){
ll a=p[i-1],b=p[i];
if(a>b)swap(a,b);
init(a,b);
}
for(int i=1;i<=n-1;i++)d[i]+=d[i-1];
ll sum=0;
for(int i=1;i<=n-1;i++){
ll x,y,z;
cin>>x>>y>>z;
sum+=min(x*d[i],y*d[i]+z);
}
cout<<sum;
return 0;
}