P3406 海底高铁(差分)

 题意:每一个条铁路都会被经过多次,求这一条铁路是办卡+充值花的钱少还是直接买多次票花的钱少

分析:我们其实只需要知道一条铁路被访问了几次就可以了,再通过比较  c+b*n  和  a  的值,就可以知道是买票好还是买卡好了

一个点到另外一个点的路径中,中间经过的铁路都会被访问一遍,如果每次都一个一个的加这样太麻烦了

发现这些铁路实质上是一维的,并且是关于区间的修改的

那么就可以用差分优化了   b是差分数组

 我们想让[l,r]区间上的点都+1,只需要在b[L]++,b[r+1]--;

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100005;
typedef long long ll;
int p[N];	//要访问的城市顺序
ll a[N];	//买票
ll b[N];	//充值
ll c[N];	//买卡
ll q[N];	//差分数组
//数据范围是10^5*10^5,所以注意要开ll
int main()
{
	int n, m;
	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];
	ll res = 0;
	for (int i = 1;i < m ;i++)
	{//起点到终点,差分修改
		int t1 = p[i - 1];
		int t2 = p[i];
		if (t1 > t2)
			q[t2] += 1, q[t1] -= 1;
		else
			q[t1] += 1, q[t2] -= 1;
	}
	for (int i = 1;i <=n;i++)
	{//前缀和处理
		q[i] += q[i - 1];
	}
	for (int i = 1;i <= n-1;i++)
	{//判断一下 n*a[i]和n*b[i]+c[i]的大小
		res += min(q[i] * a[i], q[i] * b[i] + c[i]);
	}
	cout << res;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值