一、【P3406】海底高铁(差分+贪心)
由于本题涉及到线路问题,需要统计Uim途径每条线路的次数,而且Uim每次的轨迹都是很长一段路径,所以需要使用一个合理的数据结构来维护区间的变化,首先想到线段树和树状数组,但是由于本题可以直接采用差分数组来维护变化情况,故采用最简单的方法。
1.1 解题思路
1.2 AC代码
#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cstring>
#include <queue>
#include <map>
#include <set>
using namespace std;
long long d[100005] = { 0 };
int main()
{
int n, m;
cin >> n >> m;
int begin, end; cin >> begin;
for (int i = 2; i <= m; i++)
{
cin >> end;
d[min(begin, end)]++; //差分
d[max(begin, end)]--; //由于是对线路求差分,而输入的是站点,所以不用加一
begin = end;
}
for (int i = 1; i < n; i++)
{
d[i] = d[i - 1] + d[i]; //前缀和
}
long long total = 0;
int A, B, C;
for (int i = 1; i < n; i++)
{
cin >> A >> B >> C;
total += min(d[i] * A, C + B * d[i]);
}
if (m <= 1) total = 0;
cout << total;
}