洛谷 P3406 海底高铁

使用前缀和记录每段铁路经过的次数,因为n个站点只有n-1段铁路,所以尾记得-1
注意到,经过一段铁路与从小到大或从大到小无关,所以用经典前缀和就可以了。
一开始没想通非要用两组前缀和结果写了两个小时……
爆int提交了好几次,怒而全用unsignedlonglong

#include
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;
}

你可能感兴趣的:(题解)