#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
long long single_ticket[maxn], ic_ticket[maxn], ic_base[maxn];
int path_seq[maxn], traversal_count[maxn];
int main() {
int city_cnt, visit_cnt;
cin >> city_cnt >> visit_cnt;
for (int i = 1; i <= visit_cnt; ++i)
cin >> path_seq[i];
for (int seg = 1; seg <= city_cnt - 1; ++seg)
cin >> single_ticket[seg] >> ic_ticket[seg] >> ic_base[seg];
// Record frequency of crossing each segment using a difference array approach
for (int i = 1; i <= visit_cnt - 1; ++i) {
int u = path_seq[i];
int v = path_seq[i + 1];
if (u > v) swap(u, v);
traversal_count[u]++;
traversal_count[v]--;
}
// Prefix sum to obtain actual passage count for each segment
for (int seg = 1; seg <= city_cnt - 1; ++seg) {
traversal_count[seg] = traversal_count[seg - 1] + traversal_count[seg];
}
long long total_cost = 0;
for (int seg = 1; seg <= city_cnt - 1; ++seg) {
long long k = traversal_count[seg];
long long pay_per_ride = single_ticket[seg] * k;
long long pay_with_card = ic_base[seg] + ic_ticket[seg] * k;
total_cost += min(pay_per_ride, pay_with_card);
}
cout << total_cost;
return 0;
}
Minimum Cost Strategy for Traveling Across Railway Segments Using Frequency Array and Greedy Selection
Posted on Fri, 31 Jul 2026 16:17:54 +0000 by RabPHP