Submission #1309173

#TimeUsernameProblemLanguageResultExecution timeMemory
1309173IUA_HasinMarathon Race 2 (JOI24_ho_t3)C++20
7 / 100
1 ms584 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

/**
 * Problem: Marathon Race 2 (JOI 2023/2024 Final Round)
 * Complexity: O((N + Q) log N) due to sorting and binary search queries.
 */

typedef long long ll;

int main() {
    // Optimize I/O performance
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int N;
    ll L;
    if (!(cin >> N >> L)) return 0;

    // Read and sort ball positions
    vector<ll> X(N);
    for (int i = 0; i < N; i++) cin >> X[i];
    sort(X.begin(), X.end());

    // Precompute prefix sums for O(1) range sum queries
    vector<ll> pref(N + 1, 0);
    for (int i = 0; i < N; i++) {
        pref[i + 1] = pref[i] + X[i];
    }

    int Q;
    cin >> Q;
    while (Q--) {
        ll S, G, T;
        cin >> S >> G >> T;

        ll Xmin = X[0];
        ll Xmax = X[N - 1];

        // Path 1 Cost: S -> Xmin -> Xmax -> G
        // Path distance to G for a ball at X[i]:
        // If X[i] >= G, Rie can collect it on the final leg (Xmax -> G) with distance |X[i] - G|
        // If X[i] < G, Rie collects it on the middle leg (Xmin -> Xmax) with distance (Xmax - X[i]) + |Xmax - G|
        ll L1 = abs(S - Xmin) + (Xmax - Xmin) + abs(Xmax - G);
        int k1 = lower_bound(X.begin(), X.end(), G) - X.begin(); // First index i where X[i] >= G
        ll D1 = 0;
        // Elements i < k1: X[i] < G
        D1 += (ll)k1 * Xmax - pref[k1] + (ll)k1 * abs(Xmax - G);
        // Elements i >= k1: X[i] >= G
        D1 += (pref[N] - pref[k1]) - (ll)(N - k1) * G;
        ll T1 = N + L1 + D1;

        // Path 2 Cost: S -> Xmax -> Xmin -> G
        // If X[i] <= G, distance |G - X[i]| (collected on final leg Xmin -> G)
        // If X[i] > G, distance (X[i] - Xmin) + |Xmin - G| (collected on middle leg Xmax -> Xmin)
        ll L2 = abs(S - Xmax) + (Xmax - Xmin) + abs(Xmin - G);
        int k2 = upper_bound(X.begin(), X.end(), G) - X.begin() - 1; // Last index i where X[i] <= G
        ll D2 = 0;
        // Elements i <= k2: X[i] <= G
        D2 += (ll)(k2 + 1) * G - pref[k2 + 1];
        // Elements i > k2: X[i] > G
        D2 += (pref[N] - pref[k2 + 1]) - (ll)(N - 1 - k2) * Xmin + (ll)(N - 1 - k2) * abs(Xmin - G);
        ll T2 = N + L2 + D2;

        // Determine if either path satisfies the time limit
        if (min(T1, T2) <= T) {
            cout << "Yes\n";
        } else {
            cout << "No\n";
        }
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...