洛谷 P3406 海底高铁

使用前缀和记录每段铁路经过的次数,因为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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值