Submission #1025992

#TimeUsernameProblemLanguageResultExecution timeMemory
1025992ttamxNaval battle (CEOI24_battle)C++17
100 / 100
908 ms92248 KiB
#include<bits/stdc++.h> using namespace std; using T = tuple<int,int,int>; const int N=2e5+5; int n; int x[N],y[N]; char d[N]; map<int,set<pair<int,int>>> diag[4],str[2]; string pat[4]={"ES","SW","NW","EN"}; string pat2[2]={"EW","SN"}; priority_queue<T,vector<T>,greater<T>> pq; bool del[N]; int dist(int i,int j){ return abs(x[i]-x[j])+abs(y[i]-y[j]); } vector<int> getdiag(char c){ if(c=='S')return {0,1}; if(c=='W')return {2,1}; if(c=='N')return {2,3}; if(c=='E')return {0,3}; return {}; } void update(int i){ if(del[i])return; del[i]=true; int mul=1; for(int j:getdiag(d[i])){ auto &s=diag[j][x[i]+mul*y[i]]; auto r=s.erase(s.find({x[i],i})); if(r!=s.begin()&&r!=s.end()){ auto l=prev(r); auto [p1,i1]=*l; auto [p2,i2]=*r; if(d[i1]==pat[j][0]&&d[i2]==pat[j][1]){ pq.emplace(dist(i1,i2),i1,i2); } } mul=-1; } bool hor=(d[i]=='E'||d[i]=='W'); auto &s=hor?str[0][y[i]]:str[1][x[i]]; auto it=s.erase(s.find({hor?x[i]:y[i],i})); if(it!=s.begin()&&it!=s.end()){ auto [p1,i1]=*prev(it); auto [p2,i2]=*it; if(d[i1]==pat2[!hor][0]&&d[i2]==pat2[!hor][1]){ pq.emplace(dist(i1,i2),i1,i2); } } } int main(){ cin.tie(nullptr)->sync_with_stdio(false); cin >> n; for(int i=1;i<=n;i++){ cin >> x[i] >> y[i] >> d[i]; auto v=getdiag(d[i]); diag[v[0]][x[i]+y[i]].emplace(x[i],i); diag[v[1]][x[i]-y[i]].emplace(x[i],i); if(d[i]=='E'||d[i]=='W'){ str[0][y[i]].emplace(x[i],i); }else{ str[1][x[i]].emplace(y[i],i); } } for(int i=0;i<4;i++){ for(auto &[_,s]:diag[i]){ if(s.size()<2)continue; for(auto it=next(s.begin());it!=s.end();it++){ auto [p1,i1]=*prev(it); auto [p2,i2]=*it; if(d[i1]==pat[i][0]&&d[i2]==pat[i][1]){ pq.emplace(dist(i1,i2),i1,i2); } } } } for(int i=0;i<2;i++){ for(auto &[_,s]:str[i]){ if(s.size()<2)continue; for(auto it=next(s.begin());it!=s.end();it++){ auto [p1,i1]=*prev(it); auto [p2,i2]=*it; if(d[i1]==pat2[i][0]&&d[i2]==pat2[i][1]){ pq.emplace(dist(i1,i2),i1,i2); } } } } while(!pq.empty()){ auto [d,i,j]=pq.top(); pq.pop(); if(del[i]||del[j])continue; vector<pair<int,int>> col{{i,j}}; while(!pq.empty()){ auto [dd,ii,jj]=pq.top(); if(dd>d)break; pq.pop(); if(del[ii]||del[jj])continue; col.emplace_back(ii,jj); } for(auto [i,j]:col){ update(i); update(j); } } for(int i=1;i<=n;i++)if(!del[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...