제출 #1183075

#제출 시각아이디문제언어결과실행 시간메모리
1183075gygNaval battle (CEOI24_battle)C++20
100 / 100
1910 ms132980 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define arr array #define vec vector #define pii pair<int, int> #define fir first #define sec second const int N = 2e5 + 5; int n; arr<int, N> cl, rw; arr<char, N> dr; map<char, pii> dlt = {{'N', {-1, 0}}, {'S', {1, 0}}, {'W', {0, -1}}, {'E', {0, 1}}}; vec<vec<int>> in(int i) { vec<vec<int>> ans; if (dr[i] == 'N') { ans.push_back({1, cl[i], rw[i], i, 1}); ans.push_back({3, rw[i] + cl[i], cl[i], i, 0}); ans.push_back({5, rw[i] - cl[i], cl[i], i, 1}); } else if (dr[i] == 'S') { ans.push_back({1, cl[i], rw[i], i, 0}); ans.push_back({4, rw[i] + cl[i], cl[i], i, 1}); ans.push_back({6, rw[i] - cl[i], cl[i], i, 0}); } else if (dr[i] == 'W') { ans.push_back({2, rw[i], cl[i], i, 1}); ans.push_back({3, rw[i] + cl[i], cl[i], i, 1}); ans.push_back({6, rw[i] - cl[i], cl[i], i, 1}); } else { ans.push_back({2, rw[i], cl[i], i, 0}); ans.push_back({4, rw[i] + cl[i], cl[i], i, 0}); ans.push_back({5, rw[i] - cl[i], cl[i], i, 0}); } return ans; } vec<int> evl(vec<int> x, vec<int> y) { if (x.size() != 3 || y.size() != 3) return {}; if (x[2] == 1 || y[2] == 0) return {}; int i = x[1], j = y[1]; int dst = ((dr[i] == 'S' && dr[j] == 'N') || (dr[i] == 'E' && dr[j] == 'W')) ? (y[0] - x[0]) / 2 : (y[0] - x[0]); pii sqr = {rw[i] + dst * dlt[dr[i]].fir, cl[i] + dst * dlt[dr[i]].sec}; return {dst, sqr.fir, sqr.sec}; } map<pii, int> id; arr<bool, N> usd; arr<map<int, set<vec<int>>>, 10> dgn; multiset<vec<int>> ord; void intl() { for (int i = 1; i <= n; i++) id[{rw[i], cl[i]}] = i; for (int i = 1; i <= n; i++) { for (vec<int> x : in(i)) { dgn[x[0]][x[1]].insert({x[2], x[3], x[4]}); } } for (int i = 1; i <= 6; i++) { for (pair<int, set<vec<int>>> x : dgn[i]) { for (auto it = x.sec.begin(); it != x.sec.end(); it++) { auto nx = next(it, 1); if (nx == x.sec.end()) continue; vec<int> y = evl(*it, *nx); if (y.empty()) continue; ord.insert(y); } } } // for (vec<int> x : ord) { // cout << x[0] << " " << x[1] << " " << x[2] << '\n'; // } // for (int i = 1; i <= 6; i++) { // for (auto x : dgn[i]) { // for (vec<int> y : x.sec) // cout << y[0] << " " << y[1] << " " << y[2] << '\n'; // cout << '\n'; // } // } } void ers(int i, int j, vec<int> x) { auto it = dgn[i][j].find(x); vec<int> y = (it == dgn[i][j].begin()) ? vec<int>(0) : *next(it, -1); vec<int> z = (next(it, 1) == dgn[i][j].end()) ? vec<int>(0) : *next(it, 1); dgn[i][j].erase(it); vec<int> a = evl(y, x), b = evl(x, z), c = evl(y, z); if (a.size()) ord.erase(ord.find(a)); if (b.size()) ord.erase(ord.find(b)); if (c.size()) ord.insert(c); } void rmv(int i) { usd[i] = true; for (vec<int> x : in(i)) ers(x[0], x[1], {x[2], x[3], x[4]}); } vec<int> frm(int z, int x, int y) { vec<int> ans; for (char w : {'N', 'S', 'W', 'E'}) { int nw_x = x - z * dlt[w].fir, nw_y = y - z * dlt[w].sec; int i = id[{nw_x, nw_y}]; if (!i) continue; if (dr[i] != w) continue; if (usd[i]) continue; ans.push_back(i); } return ans; } void cmp() { while (ord.size()) { // for (vec<int> x : ord) { // cout << x[0] << " " << x[1] << " " << x[2] << '\n'; // } // cout << '\n'; // for (vec<int> x : dgn[4][6]) { // cout << x[0] << " " << x[1] << " " << x[2] << '\n'; // } // cout << '\n'; vec<int> x = *ord.begin(); for (int i : frm(x[0], x[1], x[2])) { rmv(i); } // for (vec<int> x : ord) { // cout << x[0] << " " << x[1] << " " << x[2] << '\n'; // } // cout << '\n'; // for (vec<int> x : dgn[4][6]) { // cout << x[0] << " " << x[1] << " " << x[2] << '\n'; // } // cout << '\n'; } } signed main() { // freopen("in", "r", stdin); cin >> n; for (int i = 1; i <= n; i++) cin >> cl[i] >> rw[i] >> dr[i]; intl(); cmp(); for (int i = 1; i <= n; i++) if (!usd[i]) cout << i << '\n'; }
#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...