Submission #1177366

#TimeUsernameProblemLanguageResultExecution timeMemory
1177366alexddNaval battle (CEOI24_battle)C++20
30 / 100
1470 ms106852 KiB
#include<bits/stdc++.h> using namespace std; const int INF = 1e9; int n; int x[200005],y[200005]; char tip[200005]; bool scos[200005]; priority_queue<pair<int,pair<int,int>>> pq;///{timp,{id1,id2}} map<int,set<pair<int,int>>> dE[3],dW[3],dN[3],dS[3]; void calc_vecini(int i)///calculeaza si restu lovirilor { if(tip[i]=='E') { auto it = dS[2][x[i]+y[i]].lower_bound({x[i],0}); if(it != dS[2][x[i]+y[i]].end()) { pq.push({-((*it).first - x[i]), {i, (*it).second}}); } } else if(tip[i]=='W') { } else if(tip[i]=='N') { } else { assert(tip[i]=='S'); auto it = dE[2][x[i]+y[i]].upper_bound({x[i],INF}); if(it != dE[2][x[i]+y[i]].begin()) { it--; pq.push({-(x[i] - (*it).first), {i, (*it).second}}); } } } void baga(int i) { if(tip[i]=='E') { dE[0][y[i]].insert({x[i],i}); dE[1][x[i] - y[i]].insert({x[i],i}); dE[2][x[i] + y[i]].insert({x[i],i}); } else if(tip[i]=='W') { dW[0][y[i]].insert({x[i],i}); dW[1][x[i] - y[i]].insert({x[i],i}); dW[2][x[i] + y[i]].insert({x[i],i}); } else if(tip[i]=='N') { dN[0][x[i]].insert({y[i],i}); dN[1][x[i] - y[i]].insert({x[i],i}); dN[2][x[i] + y[i]].insert({x[i],i}); } else { assert(tip[i]=='S'); dS[0][x[i]].insert({y[i],i}); dS[1][x[i] - y[i]].insert({x[i],i}); dS[2][x[i] + y[i]].insert({x[i],i}); } } void scoate(int i) { scos[i]=1; if(tip[i]=='E') { dE[0][y[i]].erase({x[i],i}); dE[1][x[i] - y[i]].erase({x[i],i}); dE[2][x[i] + y[i]].erase({x[i],i}); } else if(tip[i]=='W') { dW[0][y[i]].erase({x[i],i}); dW[1][x[i] - y[i]].erase({x[i],i}); dW[2][x[i] + y[i]].erase({x[i],i}); } else if(tip[i]=='N') { dN[0][x[i]].erase({y[i],i}); dN[1][x[i] - y[i]].erase({x[i],i}); dN[2][x[i] + y[i]].erase({x[i],i}); } else { assert(tip[i]=='S'); dS[0][x[i]].erase({y[i],i}); dS[1][x[i] - y[i]].erase({x[i],i}); dS[2][x[i] + y[i]].erase({x[i],i}); } } signed main() { ios_base::sync_with_stdio(0);cin.tie(0); cin>>n; for(int i=1;i<=n;i++) { cin>>x[i]>>y[i]>>tip[i]; baga(i); } for(int i=1;i<=n;i++) { calc_vecini(i); } while(!pq.empty()) { int id1 = pq.top().second.first, id2 = pq.top().second.second; pq.pop(); if(scos[id1] || scos[id2]) { if(!scos[id1]) calc_vecini(id1); if(!scos[id2]) calc_vecini(id2); continue; } scoate(id1); scoate(id2); } for(int i=1;i<=n;i++) if(!scos[i]) cout<<i<<"\n"; 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...