明显用差分·来统计坐每一段的次数
然后忘开ll喜提70,(;′д`)ゞ
cpp
复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,int> PII;
int n,m;
ll an;
ll p[100011];
ll a[100011];
ll b[100011];
ll c[100011];
ll df[100011];
ll s[100011];
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++)
{
cin>>p[i];
}
for(int i=1;i<=n-1;i++) cin>>a[i]>>b[i]>>c[i];
for(int i=0;i<m-1;i++)
{
int l=min(p[i],p[i+1]);
int r=max(p[i],p[i+1]);
df[r]--;
df[l]++;
}
for(int i=1;i<=n-1;i++)
{
s[i]=s[i-1]+df[i];
//cout<<s[i]<<" ";
}
for(int i=1;i<=n-1;i++)
{
if(a[i]*s[i]<c[i]+b[i]*s[i])
{
an+=a[i]*s[i];
}else an+=c[i]+b[i]*s[i];
}
cout<<an;
return 0;
}