题意:每一个条铁路都会被经过多次,求这一条铁路是办卡+充值花的钱少还是直接买多次票花的钱少
分析:我们其实只需要知道一条铁路被访问了几次就可以了,再通过比较 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;
}