Submission #1269172

#TimeUsernameProblemLanguageResultExecution timeMemory
1269172phancddevMP3 Player (CEOI10_mp3player)C++20
60 / 100
31 ms6472 KiB
#include <bits/stdc++.h> using namespace std; struct Node { int S, L, R; }; int VMAX; inline Node ident() { return {0, 0, VMAX}; } inline Node leafFromOp(char c) { return {(c == '+') ? 1 : -1, 0, VMAX}; } inline Node combine(const Node& left, const Node& right) { Node res; res.S = left.S + right.S; res.L = max(left.L + right.S, right.L); res.R = min(left.R + right.S, right.R); return res; } inline int clampInt(int x, int lo, int hi) { if (x < lo) return lo; if (x > hi) return hi; return x; } struct SegTree { int n; vector<Node> st; SegTree(int n_ = 0) { init(n_); } void init(int n_) { n = max(1, n_); st.assign(4 * n, ident()); } void update(int idx, const Node& val, int p, int l, int r) { if (l == r) { st[p] = val; return; } int m = (l + r) >> 1; if (idx <= m) update(idx, val, p << 1, l, m); else update(idx, val, p << 1 | 1, m + 1, r); st[p] = combine(st[p << 1], st[p << 1 | 1]); } void update(int idx, const Node& val) { update(idx, val, 1, 0, n - 1); } Node all() const { return st[1]; } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, 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) cin >> op[i] >> t[i]; if (N == 1) { cout << "infinity\n"; return 0; } vector<pair<int,int>> byDelta; byDelta.reserve(N - 1); for (int i = 2; i <= N; ++i) byDelta.emplace_back(t[i] - t[i - 1], i); sort(byDelta.begin(), byDelta.end()); vector<int> uniqD; uniqD.reserve(byDelta.size()); for (auto &p : byDelta) if (uniqD.empty() || uniqD.back() != p.first) uniqD.push_back(p.first); SegTree st(N - 1); auto imageContains = [&](const Node& F, int v) -> bool { int a = clampInt(F.S, F.L, F.R); int b = clampInt(VMAX + F.S, F.L, F.R); return a <= v && v <= b; }; Node bestF = ident(); int best_Tright = uniqD[0] - 1; if (!imageContains(bestF, V2)) {} int pos = 0; for (int g = 0; g < (int)uniqD.size(); ++g) { int dval = uniqD[g]; while (pos < (int)byDelta.size() && byDelta[pos].first == dval) { int i = byDelta[pos].second; int leafIdx = i - 2; st.update(leafIdx, leafFromOp(op[i])); ++pos; } Node cur = st.all(); if (imageContains(cur, V2)) { if (g == (int)uniqD.size() - 1) { cout << "infinity\n"; return 0; } bestF = cur; best_Tright = uniqD[g + 1] - 1; } } int S = bestF.S, L = bestF.L, R = bestF.R; int V1; if (V2 == L) V1 = min(VMAX, L - S); else if (V2 == R) V1 = VMAX; else V1 = V2 - S; cout << best_Tright << ' ' << V1 << '\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...