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);
}

  

  

posted @ 2022-03-07 09:37  心悟&&星际  阅读(77)  评论(0编辑  收藏  举报