Minimum Cost Strategy for Traveling Across Railway Segments Using Frequency Array and Greedy Selection

#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;
}

Tags: C++

Posted on Fri, 31 Jul 2026 16:17:54 +0000 by RabPHP