Submission #1248000

#TimeUsernameProblemLanguageResultExecution timeMemory
1248000kaiboyTram (CEOI13_tram)C++20
0 / 100
15 ms4168 KiB
#include <algorithm> #include <iostream> #include <set> using namespace std; const int N = 150000; const int M = 30000; const int INF = 0x3f3f3f3f; bool used[N << 1]; int ii_[M], n; set<int> ii; set<pair<int, pair<int, int>>> pp; int dist(int i, int j) { return i == -2 || j == -2 ? -1 : i == -1 || j == n << 1 ? INF : i >> 1 == j >> 1 ? 2 : (j >> 1) - (i >> 1) << 1 ^ (i & 1) != (j & 1); } int dist_(int i, int l, int r) { if (i == -2) return -1; int ans = min(dist(l, i), dist(i, r)); if (l >= 0 && used[l ^ 1]) ans = min(ans, dist(l ^ 1, i)); if (r < n << 1 && used[r ^ 1]) ans = min(ans, dist(i, r ^ 1)); return ans; } int calc(int i, int j) { if (j - i == 1) return -2; if (i == -1 && j == n << 1) return 0; if (i == -1) return used[j ^ 1] ? 0 : j & 1 ^ 1; if (j == n << 1) return used[i ^ 1] ? n - 1 << 1 : n - 1 << 1 ^ i & 1 ^ 1; i >>= 1, j >>= 1; bool a = used[i << 1 ^ 0], b = used[i << 1 ^ 1]; bool c = used[j << 1 ^ 0], d = used[j << 1 ^ 1]; if (j - i & 1) { if (j - i == 1) return !b ? i << 1 ^ 1 : j << 1 ^ 0; return i + j >> 1 << 1 ^ (a && !b); } if (a && !b && c && !d) return i + j ^ 1; if (j - i == 2 && !b) return i << 1 ^ 1; return i + j; } int main() { ios_base::sync_with_stdio(false), cin.tie(NULL); int q; cin >> n >> q; ii.insert(-1), ii.insert(n << 1); pp.insert({ dist_(calc(-1, n << 1), -1, n << 1), { -1, n << 1 } }); for (int h = 0; h < q; h++) { char c; cin >> c; if (c == 'E') { auto dlr = *pp.begin(); pp.erase(dlr); int l = dlr.second.first, r = dlr.second.second; int i = calc(l, r); used[ii_[h] = i] = true, ii.insert(i); pp.insert({ -dist_(calc(l, i), l, i), { l, i } }); pp.insert({ -dist_(calc(i, r), i, r), { i, r } }); cout << (i >> 1) + 1 << ' ' << (i & 1) + 1 << '\n'; } else { int g; cin >> g, g--; int i = ii_[g]; auto it = ii.lower_bound(i); int l = *prev(it), r = *next(it); pp.erase({ -dist_(calc(l, i), l, i), { l, i } }); pp.erase({ -dist_(calc(i, r), i, r), { i, r } }); used[i] = false, ii.erase(i); pp.insert({ -dist_(calc(l, r), l, r), { l, r } }); } } 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...