제출 #385400

#제출 시각아이디문제언어결과실행 시간메모리
385400mohamedsobhi777전차 (CEOI13_tram)C++14
65 / 100
1086 ms16288 KiB
#include <bits/stdc++.h> using namespace std; #define vi vector<int> #define vll vector<ll> #define vii vector<pair<int, int>> #define pii pair<int, int> #define pll pair<ll, ll> #define loop(_) for (int __ = 0; __ < (_); ++__) #define pb push_back #define f first #define s second #define sz(_) ((int)_.size()) #define all(_) _.begin(), _.end() #define lb lower_bound #define ub upper_bound using ll = long long; using ld = long double; const int N = 2e5 + 7; const ll mod = 1e9 + 7; int n, m; int vis[N][2]; int xs[N], ys[N]; multiset<int> mul; struct cmp { bool operator()(pii x, pii y) { return x.s - x.f != y.s - y.f ? x.s - x.f > y.s - y.f : x.f < y.f; } }; set<pii, cmp> st; set<pii> rst, al; ll calc(int x, int y) { ll ret = 1e18; if (mul.empty()) return ret; auto eval = [&](int u) -> void { for (int i = 0; i < 2; ++i) { if (vis[u][i]) { ret = min(ret, 1ll * (u - x) * (u - x) + 1ll * (i - y) * (i - y)); } } }; auto it = mul.lb(x); if (it != mul.end()) eval(*it); if (it != mul.begin()) eval(*(--it)); return ret; } void Insert(int x, int y) { st.insert({x, y}); rst.insert({x, y}); } void Erase(int x, int y) { st.erase({x, y}); rst.erase({x, y}); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); #ifndef ONLINE_JUDGE #endif cin >> n >> m; for (int i = 0; i < n; ++i) { al.insert({i, 0}), al.insert({i, 1}); } Insert(0, n - 1); for (int i = 0; i < m; ++i) { char c; cin >> c; if (c == 'E') { ll Min = 0; int wx = 0, wy = 0; if (sz(st)) { vii vc = {{0, 0}, {0, 1}, {n - 1, 0}, {n - 1, 1}}; for (auto u : vc) { ll sc = calc(u.f, u.s); if (sc > Min) { Min = sc; wx = u.f, wy = u.s; } } for (auto u : st) { int x = u.f, y = u.s; int mi = (x + y) >> 1; for (auto mid : {mi, mi + 1}) for (int i = 0; i < 2; ++i) { if (mid < x || mid > y) continue; ll w = calc(mid, i); if (w > Min || (w == Min && make_pair(mid, i) < make_pair(wx, wy))) { Min = w; wx = mid, wy = i; } } if ((y - x) < (*st.begin()).s - (*st.begin()).f - 1) { break; } } if (Min <= 1) { auto bg = al.begin(); wx = (*bg).f, wy = (*bg).s; } } else if (!sz(mul)) ; else { auto bg = al.begin(); wx = (*bg).f, wy = (*bg).s; } xs[i] = wx, ys[i] = wy; vis[wx][wy] = 1; auto it = rst.lb({wx + 1, -1}); if (it != rst.begin()) { --it; if (wx >= (*it).f && wx <= (*it).s) { pii u = *it; int x = u.f, y = u.s; Erase(x, y); if (x <= wx - 1) Insert(x, wx - 1); if (wx + 1 <= y) Insert(wx + 1, y); } } mul.insert(wx); al.erase({wx, wy}); cout << ++wx << " " << ++wy << "\n"; } else { int p; cin >> p; --p; mul.erase(mul.find(xs[p])); vis[xs[p]][ys[p]] = 0; al.insert({xs[p], ys[p]}); if (vis[xs[p]][0] == vis[xs[p]][1]) { int nx = xs[p], ny = xs[p]; auto it = rst.lb({xs[p], -1}); pii del = {-1, -1}; if (it != rst.end() && (*it).f == ny + 1) { ny = (*it).s; del = {(*it).f, (*it).s}; } if (it != rst.begin()) { --it; if ((*it).s == nx - 1) { nx = (*it).f; Erase((*it).f, (*it).s); } } if (~del.f) Erase(del.f, del.s); Insert(nx, ny); } } } 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...