使用前缀和记录每段铁路经过的次数,因为n个站点只有n-1段铁路,所以尾记得-1
注意到,经过一段铁路与从小到大或从大到小无关,所以用经典前缀和就可以了。
一开始没想通非要用两组前缀和结果写了两个小时……
爆int提交了好几次,怒而全用unsignedlonglong
#include<bits/stdc++.h>
using namespace std;
unsigned long long n,m;
unsigned long long a[100007],b[100007],c[100007];
unsigned long long s[100007],t[100007];
unsigned long long fro,to;
unsigned long long ans;
int main(){
scanf("%lld%lld",&n,&m);
scanf("%lld",&fro);
for(int i=1;i<m;++i){
scanf("%lld",&to);
if(fro<to){
++s[fro];--s[to+1-1];
}else{
++s[to];--s[fro+1-1];
}
fro=to;
}
for(int i=1;i<n;++i)scanf("%lld%lld%lld",&a[i],&b[i],&c[i]);
for(int i=1;i<=n;++i)t[i]=t[i-1]+s[i];
for(int i=1;i<n;++i){
unsigned long long x=a[i]*t[i],y=c[i]+t[i]*b[i];
x>y?ans+=y:ans+=x;
}
printf("%lld\n",ans);
return 0;
}