Submission #1290043

#TimeUsernameProblemLanguageResultExecution timeMemory
1290043loomNaval battle (CEOI24_battle)C++20
100 / 100
1008 ms101908 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define inf (int)5e18 #define nl '\n' void solve(){ int n; cin>>n; map<int, set<array<int,3>>> mp[6]; vector<tuple<int,int,char>> v(n); for(int i = 0; i < n; i++){ auto &[x, y, d] = v[i]; cin>>x>>y>>d; swap(x, y); if(d == 'E'){ mp[0][x-y].insert({x, 0, i}); mp[1][x+y].insert({x, 1, i}); mp[2][x].insert({y/2, 0, i}); } if(d == 'N'){ mp[0][x-y].insert({x, 1, i}); mp[3][y].insert({x/2, 1, i}); mp[4][x+y].insert({x, 1, i}); } if(d == 'S'){ mp[1][x+y].insert({x, 0, i}); mp[3][y].insert({x/2, 0, i}); mp[5][x-y].insert({x, 0, i}); } if(d == 'W'){ mp[2][x].insert({y/2, 1, i}); mp[4][x+y].insert({x, 0, i}); mp[5][x-y].insert({x, 1, i}); } } priority_queue<array<int,3>, vector<array<int,3>>, greater<array<int,3>>> pq; for(int w = 0; w < 6; w++){ for(auto &[x, st] : mp[w]){ auto pit = st.begin(), it = st.begin(); while(++it != st.end()){ auto [p1, d1, i1] = *pit; auto [p2, d2, i2] = *it; if(!d1 and d2) pq.push({p2 - p1, i1, i2}); pit++; } } } auto del = [&](int m, int w, int p, int d, int i){ auto &st = mp[m][w]; auto it = st.find({p, d, i}); it = st.erase(it); if(it == st.begin() or it == st.end()) return; auto pit = prev(it); auto [p1, d1, i1] = *pit; auto [p2, d2, i2] = *it; if(!d1 and d2) pq.push({p2 - p1, i1, i2}); }; auto rem = [&](int i){ auto [x, y, d] = v[i]; if(d == 'E'){ del(0, x-y, x, 0, i); del(1, x+y, x, 1, i); del(2, x, y/2, 0, i); } if(d == 'N'){ del(0, x-y, x, 1, i); del(3, y, x/2, 1, i); del(4, x+y, x, 1, i); } if(d == 'S'){ del(1, x+y, x, 0, i); del(3, y, x/2, 0, i); del(5, x-y, x, 0, i); } if(d == 'W'){ del(2, x, y/2, 1, i); del(4, x+y, x, 0, i); del(5, x-y, x, 1, i); } }; vector<int> dt(n); while(!pq.empty()){ auto [t, i1, i2] = pq.top(); pq.pop(); if((dt[i1] or dt[i2]) and dt[i1] != t and dt[i2] != t) continue; if(!dt[i1]) rem(i1); if(!dt[i2]) rem(i2); dt[i1] = dt[i2] = t; } for(int i = 0; i < n; i++) if(!dt[i]) cout<<i+1<<nl; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(NULL);cout.tie(NULL); int t = 1; //cin>>t; while(t--) solve(); 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...