P3406 海底高铁 题解
P3406 海底高铁
题解
区间修改可以用差分思想,统计每个点出现次数用前缀和,最后取最小值
#include<bits/stdc++.h> using namespace std; const int maxn=100009; int p[maxn],v[maxn]; long long ans; int main() { int n,m; scanf("%d %d",&n,&m); for (int i=1;i<=m;i++) { scanf("%d",&p[i]); } for (int i=1;i<m;i++) { int x,y; x=min(p[i],p[i+1]); y=max(p[i],p[i+1]); v[x]++;//区间修改 v[y]--; } for (int i=1;i<=n;i++) v[i]+=v[i-1];//统计每个点到过的次数 for (int i=1;i<n;i++) { long long a,b,c; scanf("%d %d %d",&a,&b,&c); ans+=min(a*v[i],b*v[i]+c);//对于每次乘车是用纸质还是IC卡 } printf("%ld",ans); }