Submission #1134345

#TimeUsernameProblemLanguageResultExecution timeMemory
1134345amunduzbaevNaval battle (CEOI24_battle)C++20
100 / 100
1337 ms89400 KiB
#include "bits/stdc++.h" using namespace std; //~ #define int ll typedef long long ll; #define ar array template<class T> bool umin(T& a, T b) { if(b < a) { a = b; return true; } return false; } template<class T> bool umax(T& a, T b) { if(a < b) { a = b; return true; } return false; } //~ const int mod = 1e9 + 7; //~ void add(int& a, const int b){ //~ a += b; //~ while(a >= mod) a -= mod; //~ while(a < 0) a += mod; //~ } const int inf = 1e9 + 5; void solve(){ int n; cin >> n; vector<int> x(n), y(n), d(n); vector<ar<int, 2>> coll[3] = { { {0, 3}, {1, 2} }, { {2, 3}, {1, 0} }, { {1, 3}, {2, 0} } }; for(int i=0;i<n;i++){ char c; cin >> x[i] >> y[i] >> c; if(c == 'N') d[i] = 0; if(c == 'E') d[i] = 1; if(c == 'S') d[i] = 2; if(c == 'W') d[i] = 3; } auto check = [&](int i, int j){ if(x[i] > x[j]) swap(i, j); if(x[i] == x[j] && y[i] > y[j]) swap(i, j); ar<int, 2> d_ = {d[i], d[j]}; if(x[i] + y[i] == x[j] + y[j] && (d_ == coll[0][0] || d_ == coll[0][1])){ return abs(x[i] - x[j]); } if(x[i] - y[i] == x[j] - y[j] && (d_ == coll[1][0] || d_ == coll[1][1])) { return abs(x[i] - x[j]); } if(d_ == coll[2][0] && y[i] == y[j]) return (x[j] - x[i]) / 2; if(d_ == coll[2][1] && x[i] == x[j]) return (y[j] - y[i]) / 2; return inf + 1; }; map<int, set<ar<int, 2>>> d1[2], d2[2]; map<int, set<ar<int, 2>>> ver, hor; for(int i=0;i<n;i++){ bool f = d[i] == 0 || d[i] == 3; //~ cout<<i<<" "<<f<<"\n"; d1[f][x[i] + y[i]].insert({x[i], i}); d2[d[i] < 2][x[i] - y[i]].insert({x[i], i}); if(d[i] % 2 == 0) ver[x[i]].insert({y[i], i}); if(d[i] % 2 == 1) hor[y[i]].insert({x[i], i}); } //~ for(auto x : d1[0][12]){ //~ cout<<x<<" "; //~ }cout<<"\n"; priority_queue<ar<int, 3>, vector<ar<int, 3>>, greater<ar<int, 3>> > mn; auto err = [&](set<ar<int, 2>>& s, int v, int i){ s.erase({v, i}); auto it = s.upper_bound({v, i}); if(it != s.end() && it != s.begin()){ int r = (*it)[1]; --it; int l = (*it)[1]; mn.push({check(l, r), l, r}); } }; auto upd = [&](int i){ bool f = d[i] == 0 || d[i] == 3; err(d1[f][x[i] + y[i]], x[i], i); err(d2[d[i] < 2][x[i] - y[i]], x[i], i); if(d[i] % 2 == 0) err(ver[x[i]], y[i], i); // ver[x[i]].insert(i); if(d[i] % 2 == 1) err(hor[y[i]], x[i], i); // hor[y[i]].insert(i); }; auto calc = [&](set<ar<int, 2>>& s){ int prev = -1; for(auto [x, i] : s){ if(prev != -1){ //~ cout<<prev<<" "<<i<<" "<<check(prev, i)<<"\n"; mn.push({check(prev, i), i, prev}); } prev = i; } }; for(int t=0;t<2;t++){ for(auto [dg, s] : d1[t]){ calc(s); } for(auto [dg, s] : d2[t]){ calc(s); } } for(auto [lin, s] : ver) { calc(s); } for(auto [lin, s] : hor) { calc(s); } vector<int> liv(n, 1); while(!mn.empty()){ vector<ar<int, 3>> curr; auto [dis, unused_i, unused_j] = mn.top(); if(dis > inf) break; while(!mn.empty() && mn.top()[0] == dis){ curr.push_back(mn.top()); mn.pop(); } vector<int> to_upd; for(auto [dis, i, j] : curr){ if(!liv[i] || !liv[j]) continue; to_upd.push_back(i); to_upd.push_back(j); } for(auto x : to_upd){ if(liv[x]){ liv[x] = 0; upd(x); } } } for(int i=0;i<n;i++){ if(liv[i]) cout<<i + 1<<"\n"; } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); int t = 1; //~ cin >> t; while(t--){ solve(); } }
#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...