Submission #1269168

#TimeUsernameProblemLanguageResultExecution timeMemory
1269168phancddevMP3 Player (CEOI10_mp3player)C++20
40 / 100
1095 ms1604 KiB
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, Vmax, V2;
    if (!(cin >> N >> Vmax >> V2)) return 0;

    vector<char> op(N + 1);
    vector<int> t(N + 1);

    for (int i = 1; i <= N; ++i) {
        char c; int ti;
        cin >> c >> ti;
        op[i] = c;
        t[i] = ti;
    }

    vector<int> diffs; diffs.reserve(max(0, N - 1));
    for (int i = 2; i <= N; ++i) diffs.push_back(t[i] - t[i - 1]);

    vector<int> uniq = diffs;
    sort(uniq.begin(), uniq.end());
    uniq.erase(unique(uniq.begin(), uniq.end()), uniq.end());

    auto simulate = [&](int threshold, int start) -> int {
        int v = start;
        for (int i = 2; i <= N; ++i) {
            int delta = t[i] - t[i - 1];
            if (delta <= threshold) {
                if (op[i] == '+') {
                    if (v < Vmax) ++v;
                } else {
                    if (v > 0) --v;
                }
            }
        }
        return v;
    };

    auto inRange = [&](int threshold) -> pair<int,int> {
        int a = simulate(threshold, 0);
        int b = simulate(threshold, Vmax);
        if (a > b) swap(a, b);
        return {a, b};
    };

    auto maxV1For = [&](int threshold, int target) -> int {
        int lo = 0, hi = Vmax;
        while (lo < hi) {
            int mid = (lo + hi + 1) >> 1;
            int fmid = simulate(threshold, mid);
            if (fmid <= target) lo = mid;
            else hi = mid - 1;
        }
        return lo;
    };

    if (uniq.empty()) {
        cout << "infinity\n";
        return 0;
    }

    {
        int d_last = uniq.back();
        auto [L, R] = inRange(d_last);
        if (L <= V2 && V2 <= R) {
            cout << "infinity\n";
            return 0;
        }
    }

    for (int j = (int)uniq.size() - 2; j >= 0; --j) {
        int thr = uniq[j];
        auto [L, R] = inRange(thr);
        if (L <= V2 && V2 <= R) {
            int T_ans = uniq[j + 1] - 1;
            int V1_ans = maxV1For(thr, V2);
            cout << T_ans << ' ' << V1_ans << "\n";
            return 0;
        }
    }

    {
        int T_ans = uniq.front() - 1;
        int V1_ans = V2;
        cout << T_ans << ' ' << V1_ans << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...