제출 #1044373

#제출 시각아이디문제언어결과실행 시간메모리
1044373SamAndNaval battle (CEOI24_battle)C++17
100 / 100
1559 ms124068 KiB
#include <bits/stdc++.h> using namespace std; #define m_p make_pair #define all(x) (x).begin(),(x).end() #define sz(x) ((int)(x).size()) #define fi first #define se second typedef long long ll; mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count()); mt19937 rnf(2106); const int N = 200005; int n; int x[N], y[N]; char ty[N]; int f(const pair<int, int>& t1, const pair<int, int>& t2) { return (abs(t1.fi - t2.fi) + abs(t1.se - t2.se)) / 2; } set<pair<int, pair<pair<int, int>, pair<int, int> > > > orz; void ave(set<pair<pair<int, int>, bool> >& s, int x, int y, bool z, int ttt) { if (ttt == +1) { if (!s.empty()) { auto it = s.lower_bound(m_p(m_p(x, y), z)); if (it != s.end() && it != s.begin()) { if (it->se == true) { pair<int, int> r = it->fi; --it; if (it->se == false) { pair<int, int> l = it->fi; orz.erase(m_p(f(l, r), m_p(l, r))); } } } } s.insert(m_p(m_p(x, y), z)); auto it = s.find(m_p(m_p(x, y), z)); if (z == false) { pair<int, int> l = m_p(x, y); ++it; if (it != s.end()) { if (it->se == true) { pair<int, int> r = it->fi; orz.insert(m_p(f(l, r), m_p(l, r))); } } } else { pair<int, int> r = m_p(x, y); if (it != s.begin()) { --it; if (it->se == false) { pair<int, int> l = it->fi; orz.insert(m_p(f(l, r), m_p(l, r))); } } } } else if (ttt == -1) { auto it = s.find(m_p(m_p(x, y), z)); if (z == false) { pair<int, int> l = m_p(x, y); ++it; if (it != s.end()) { if (it->se == true) { pair<int, int> r = it->fi; orz.erase(m_p(f(l, r), m_p(l, r))); } } } else { pair<int, int> r = m_p(x, y); if (it != s.begin()) { --it; if (it->se == false) { pair<int, int> l = it->fi; orz.erase(m_p(f(l, r), m_p(l, r))); } } } s.erase(m_p(m_p(x, y), z)); if (!s.empty()) { auto it = s.lower_bound(m_p(m_p(x, y), z)); if (it != s.end() && it != s.begin()) { if (it->se == true) { pair<int, int> r = it->fi; --it; if (it->se == false) { pair<int, int> l = it->fi; orz.insert(m_p(f(l, r), m_p(l, r))); } } } } } else assert(false); } vector<int> s, d, xx, yy; set<pair<pair<int, int>, bool> > ew[N], sn[N], es[N], nw[N], en[N], sw[N]; void ave(int x, int y, char ty, int ttt) { // EW if (ty == 'E') { int i = lower_bound(all(yy), y) - yy.begin(); ave(ew[i], x, y, false, ttt); } if (ty == 'W') { int i = lower_bound(all(yy), y) - yy.begin(); ave(ew[i], x, y, true, ttt); } // SN if (ty == 'S') { int i = lower_bound(all(xx), x) - xx.begin(); ave(sn[i], x, y, false, ttt); } if (ty == 'N') { int i = lower_bound(all(xx), x) - xx.begin(); ave(sn[i], x, y, true, ttt); } // ES if (ty == 'E') { int i = lower_bound(all(s), x + y) - s.begin(); ave(es[i], x, y, false, ttt); } if (ty == 'S') { int i = lower_bound(all(s), x + y) - s.begin(); ave(es[i], x, y, true, ttt); } // NW if (ty == 'N') { int i = lower_bound(all(s), x + y) - s.begin(); ave(nw[i], x, y, false, ttt); } if (ty == 'W') { int i = lower_bound(all(s), x + y) - s.begin(); ave(nw[i], x, y, true, ttt); } // EN if (ty == 'E') { int i = lower_bound(all(d), x - y) - d.begin(); ave(en[i], x, y, false, ttt); } if (ty == 'N') { int i = lower_bound(all(d), x - y) - d.begin(); ave(en[i], x, y, true, ttt); } // SW if (ty == 'S') { int i = lower_bound(all(d), x - y) - d.begin(); ave(sw[i], x, y, false, ttt); } if (ty == 'W') { int i = lower_bound(all(d), x - y) - d.begin(); ave(sw[i], x, y, true, ttt); } } bool c[N]; void solv() { cin >> n; map<pair<int, int>, int> mp; for (int i = 1; i <= n; ++i) { cin >> x[i] >> y[i] >> ty[i]; mp[m_p(x[i], y[i])] = i; } for (int i = 1; i <= n; ++i) { s.push_back(x[i] + y[i]); d.push_back(x[i] - y[i]); xx.push_back(x[i]); yy.push_back(y[i]); } sort(all(s)); sort(all(d)); sort(all(xx)); sort(all(yy)); for (int i = 1; i <= n; ++i) { ave(x[i], y[i], ty[i], 1); } while (!orz.empty()) { int d = orz.begin()->fi; vector<int> t; while (!orz.empty()) { auto it = orz.begin(); if (it->fi != d) break; int i = mp[it->se.fi]; int j = mp[it->se.se]; if (c[i] || c[j]) { orz.erase(it); continue; } t.push_back(i); t.push_back(j); orz.erase(it); } for (int i = 0; i < sz(t); ++i) { if (c[t[i]]) continue; c[t[i]] = true; ave(x[t[i]], y[t[i]], ty[t[i]], -1); } } for (int i = 1; i <= n; ++i) { if (!c[i]) cout << i << "\n"; } } int main() { #ifdef SOMETHING freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); #endif // SOMETHING ios_base::sync_with_stdio(false), cin.tie(0); int tt = 1; //cin >> tt; while (tt--) { solv(); } 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...