Submission #1222493

#TimeUsernameProblemLanguageResultExecution timeMemory
1222493AriadnaNaval battle (CEOI24_battle)C++20
76 / 100
2987 ms1114112 KiB
#include <bits/stdc++.h> using namespace std; char dir[4] = {'N', 'S', 'E', 'W'}; struct Ship { int x, y, d; pair<int, int> move; void init() { if (d == 0) move = {0, -1}; else if (d == 1) move = {0, 1}; else if (d == 2) move = {1, 0}; else move = {-1, 0}; } }; void solve1(int n, vector<Ship>& s) { vector<pair<int, pair<int, int>>> collision; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { int col = (abs(s[i].x-s[j].x)+abs(s[i].y-s[j].y))/2; if (s[i].x == s[j].x) { if (s[i].d == 0 && s[j].d == 1) { if (s[i].y > s[j].y) collision.push_back({col, {i, j}}); } else if (s[i].d == 1 && s[j].d == 0) { if (s[i].y < s[j].y) collision.push_back({col, {i, j}}); } } else if (s[i].y == s[j].y) { if (s[i].d == 2 && s[j].d == 3) { if (s[i].x < s[j].x) collision.push_back({col, {i, j}}); } else if (s[i].d == 3 && s[j].d == 2) { if (s[i].x > s[j].x) collision.push_back({col, {i, j}}); } } else if (s[i].x+s[i].y == s[j].x+s[j].y) { if (s[i].d == 0) { if (s[j].d == 3 && s[j].x > s[i].x) collision.push_back({col, {i, j}}); } else if (s[i].d == 1) { if (s[j].d == 2 && s[j].x < s[i].x) collision.push_back({col, {i, j}}); } else if (s[i].d == 2) { if (s[j].d == 1 && s[j].x > s[i].x) collision.push_back({col, {i, j}}); } else { if (s[j].d == 0 && s[j].x < s[i].x) collision.push_back({col, {i, j}}); } } else if (s[i].x-s[i].y == s[j].x-s[j].y) { if (s[i].d == 0) { if (s[j].d == 2 && s[j].x < s[i].x) collision.push_back({col, {i, j}}); } else if (s[i].d == 1) { if (s[j].d == 3 && s[j].x > s[i].x) collision.push_back({col, {i, j}}); } else if (s[i].d == 2) { if (s[j].d == 0 && s[j].x > s[i].x) collision.push_back({col, {i, j}}); } else { if (s[j].d == 1 && s[j].x < s[i].x) collision.push_back({col, {i, j}}); } } } } sort(collision.begin(), collision.end()); int m = (int)collision.size(); vector<bool> sink(n, false); int act_col = -1; vector<int> aux; for (int i = 0; i < m; ++i) { int col = collision[i].first, i1 = collision[i].second.first, i2 = collision[i].second.second; if (col != act_col) { for (int a: aux) sink[a] = true; aux = {}; act_col = col; } if (!sink[i1] && !sink[i2]) { aux.push_back(i1); aux.push_back(i2); } } for (int i: aux) sink[i] = true; for (int i = 0; i < n; ++i) { if (!sink[i]) cout << i+1 << endl; } } void solve2(int n, vector<Ship>& s) { map<int, int> comp; set<int> diagonals; for (int i = 0; i < n; ++i) diagonals.insert(s[i].x+s[i].y); int cnt = 0; for (int a: diagonals) { comp[a] = cnt; ++cnt; } int m = (int)diagonals.size(); vector<vector<pair<int, int>>> D(m); for (int i = 0; i < n; ++i) { D[comp[s[i].x+s[i].y]].push_back({s[i].x, i}); } vector<bool> sink(n, false); for (int i = 0; i < m; ++i) { sort(D[i].begin(), D[i].end()); vector<int> v; for (int j = 0; j < (int)D[i].size(); ++j) { int idx = D[i][j].second; if (s[idx].d == 1) { if (!v.empty()) { sink[idx] = true; int idx2 = v[(int)v.size()-1]; sink[idx2] = true; v.pop_back(); } } else v.push_back(idx); } } for (int i = 0; i < n; ++i) { if (!sink[i]) cout << i+1 << endl; } } int main() { ios::sync_with_stdio(false); cin.tie(NULL); int n; cin >> n; vector<Ship> s(n); bool N = false, W = false; for (int i = 0; i < n; ++i) { int x, y, d; char c; cin >> x >> y >> c; if (c == 'N') { d = 0; N = true; } else if (c == 'S') d = 1; else if (c == 'E') d = 2; else { d = 3; W = true; } s[i].x = x; s[i].y = y; s[i].d = d; s[i].init(); } if (N||W) solve1(n, s); else solve2(n, s); 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...