Submission #1227205

#TimeUsernameProblemLanguageResultExecution timeMemory
1227205MalixNaval battle (CEOI24_battle)C++20
100 / 100
620 ms96792 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<int> vi; typedef vector<vi> vii; typedef pair<int,int> pi; typedef vector<pi> pii; typedef tuple<int,int,int> ti; typedef vector<ll> li; typedef vector<li> lii; #define REP(i,a,b) for(int i=a;i<b;i++) #define F first #define S second #define PB push_back #define LSOne(s) ((s)&(-s)) #define all(x) (x).begin(),(x).end() ll INF=1000000000000000010; int inf=1e9+10; ll M=1e9+7; //0-N, 1-S, 2-E, 3-W int main() { ios::sync_with_stdio(0); cin.tie(0); int n;cin>>n; vii a(n,vi(3,0)); REP(i,0,n){ int x,y;cin>>x>>y; char z;cin>>z; swap(x,y); a[i][0]=x; a[i][1]=y; if(z=='S')a[i][2]=1; else if(z=='E')a[i][2]=2; else if(z=='W')a[i][2]=3; } unordered_map<int,set<pi>> P,Q,R,S,T,U; priority_queue<ti,vector<ti>,greater<ti>> pq; REP(i,0,n){ int x=a[i][0],y=a[i][1],z=a[i][2]; if(z==2||z==3)P[x].insert({y,i}); if(z==0||z==1)Q[y].insert({x,i}); if(z==2||z==1)R[x+y].insert({x,i}); if(z==2||z==0)S[x-y].insert({x,i}); if(z==3||z==1)T[x-y].insert({x,i}); if(z==3||z==0)U[x+y].insert({x,i}); } for(auto [u,v]:P){ if(v.empty())continue; auto prev=v.begin(); auto ps=next(prev); while(ps!=v.end()){ int x=prev->S,y=ps->S; if(a[x][2]==2&&a[y][2]==3)pq.push({abs(a[x][1]-a[y][1])/2,x,y}); prev=ps; ps=next(prev); } } for(auto [u,v]:Q){ if(v.empty())continue; auto prev=v.begin(); auto ps=next(prev); while(ps!=v.end()){ int x=prev->S,y=ps->S; if(a[x][2]==1&&a[y][2]==0)pq.push({abs(a[x][0]-a[y][0])/2,x,y}); prev=ps; ps=next(prev); } } for(auto [u,v]:R){ if(v.empty())continue; auto prev=v.begin(); auto ps=next(prev); while(ps!=v.end()){ int x=prev->S,y=ps->S; if(a[x][2]==1&&a[y][2]==2)pq.push({abs(a[x][0]-a[y][0]),x,y}); prev=ps; ps=next(prev); } } for(auto [u,v]:S){ if(v.empty())continue; auto prev=v.begin(); auto ps=next(prev); while(ps!=v.end()){ int x=prev->S,y=ps->S; if(a[x][2]==2&&a[y][2]==0)pq.push({abs(a[x][0]-a[y][0]),x,y}); prev=ps; ps=next(prev); } } for(auto [u,v]:T){ if(v.empty())continue; auto prev=v.begin(); auto ps=next(prev); while(ps!=v.end()){ int x=prev->S,y=ps->S; if(a[x][2]==1&&a[y][2]==3)pq.push({abs(a[x][0]-a[y][0]),x,y}); prev=ps; ps=next(prev); } } for(auto [u,v]:U){ if(v.empty())continue; auto prev=v.begin(); auto ps=next(prev); while(ps!=v.end()){ int x=prev->S,y=ps->S; if(a[x][2]==3&&a[y][2]==0)pq.push({abs(a[x][0]-a[y][0]),x,y}); prev=ps; ps=next(prev); } } vi b(n,inf); while(!pq.empty()){ auto [z,x,y]=pq.top(); pq.pop(); if(b[x]<z||b[y]<z)continue; b[x]=z;b[y]=z; if(a[x][2]==0||a[x][2]==1){ if(Q[a[x][1]].count({a[x][0],x})){ auto it=Q[a[x][1]].find({a[x][0],x}); auto nx=next(it); if(nx!=Q[a[x][1]].end()&&it!=Q[a[x][1]].begin()){ auto pr=prev(it); int l=pr->S,r=nx->S; if(a[l][2]==1&&a[r][2]==0)pq.push({abs(a[l][0]-a[r][0])/2,l,r}); } Q[a[x][1]].erase(it); } } if(a[x][2]==2||a[x][2]==3){ if(P[a[x][0]].count({a[x][1],x})){ auto it=P[a[x][0]].find({a[x][1],x}); auto nx=next(it); if(nx!=P[a[x][0]].end()&&it!=P[a[x][0]].begin()){ auto pr=prev(it); int l=pr->S,r=nx->S; if(a[l][2]==2&&a[r][2]==3)pq.push({abs(a[l][1]-a[r][1])/2,l,r}); } P[a[x][0]].erase(it); } } int k=a[x][0]+a[x][1],k2=a[x][0]-a[x][1]; if(a[x][2]==1||a[x][2]==2){ if(R[k].count({a[x][0],x})){ auto it=R[k].find({a[x][0],x}); auto nx=next(it); if(nx!=R[k].end()&&it!=R[k].begin()){ auto pr=prev(it); int l=pr->S,r=nx->S; if(a[l][2]==1&&a[r][2]==2)pq.push({abs(a[l][0]-a[r][0]),l,r}); } R[k].erase(it); } } if(a[x][2]==0||a[x][2]==2){ if(S[k2].count({a[x][0],x})){ auto it=S[k2].find({a[x][0],x}); auto nx=next(it); if(nx!=S[k2].end()&&it!=S[k2].begin()){ auto pr=prev(it); int l=pr->S,r=nx->S; if(a[l][2]==2&&a[r][2]==0)pq.push({abs(a[l][0]-a[r][0]),l,r}); } S[k2].erase(it); } } if(a[x][2]==1||a[x][2]==3){ if(T[k2].count({a[x][0],x})){ auto it=T[k2].find({a[x][0],x}); auto nx=next(it); if(nx!=T[k2].end()&&it!=T[k2].begin()){ auto pr=prev(it); int l=pr->S,r=nx->S; if(a[l][2]==1&&a[r][2]==3)pq.push({abs(a[l][0]-a[r][0]),l,r}); } T[k2].erase(it); } } if(a[x][2]==0||a[x][2]==3){ if(U[k].count({a[x][0],x})){ auto it=U[k].find({a[x][0],x}); auto nx=next(it); if(nx!=U[k].end()&&it!=U[k].begin()){ auto pr=prev(it); int l=pr->S,r=nx->S; if(a[l][2]==3&&a[r][2]==0)pq.push({abs(a[l][0]-a[r][0]),l,r}); } U[k].erase(it); } } swap(x,y); if(a[x][2]==0||a[x][2]==1){ if(Q[a[x][1]].count({a[x][0],x})){ auto it=Q[a[x][1]].find({a[x][0],x}); auto nx=next(it); if(nx!=Q[a[x][1]].end()&&it!=Q[a[x][1]].begin()){ auto pr=prev(it); int l=pr->S,r=nx->S; if(a[l][2]==1&&a[r][2]==0)pq.push({abs(a[l][0]-a[r][0])/2,l,r}); } Q[a[x][1]].erase(it); } } if(a[x][2]==2||a[x][2]==3){ if(P[a[x][0]].count({a[x][1],x})){ auto it=P[a[x][0]].find({a[x][1],x}); auto nx=next(it); if(nx!=P[a[x][0]].end()&&it!=P[a[x][0]].begin()){ auto pr=prev(it); int l=pr->S,r=nx->S; if(a[l][2]==2&&a[r][2]==3)pq.push({abs(a[l][1]-a[r][1])/2,l,r}); } P[a[x][0]].erase(it); } } k=a[x][0]+a[x][1],k2=a[x][0]-a[x][1]; if(a[x][2]==1||a[x][2]==2){ if(R[k].count({a[x][0],x})){ auto it=R[k].find({a[x][0],x}); auto nx=next(it); if(nx!=R[k].end()&&it!=R[k].begin()){ auto pr=prev(it); int l=pr->S,r=nx->S; if(a[l][2]==1&&a[r][2]==2)pq.push({abs(a[l][0]-a[r][0]),l,r}); } R[k].erase(it); } } if(a[x][2]==0||a[x][2]==2){ if(S[k2].count({a[x][0],x})){ auto it=S[k2].find({a[x][0],x}); auto nx=next(it); if(nx!=S[k2].end()&&it!=S[k2].begin()){ auto pr=prev(it); int l=pr->S,r=nx->S; if(a[l][2]==2&&a[r][2]==0)pq.push({abs(a[l][0]-a[r][0]),l,r}); } S[k2].erase(it); } } if(a[x][2]==1||a[x][2]==3){ if(T[k2].count({a[x][0],x})){ auto it=T[k2].find({a[x][0],x}); auto nx=next(it); if(nx!=T[k2].end()&&it!=T[k2].begin()){ auto pr=prev(it); int l=pr->S,r=nx->S; if(a[l][2]==1&&a[r][2]==3)pq.push({abs(a[l][0]-a[r][0]),l,r}); } T[k2].erase(it); } } if(a[x][2]==0||a[x][2]==3){ if(U[k].count({a[x][0],x})){ auto it=U[k].find({a[x][0],x}); auto nx=next(it); if(nx!=U[k].end()&&it!=U[k].begin()){ auto pr=prev(it); int l=pr->S,r=nx->S; if(a[l][2]==3&&a[r][2]==0)pq.push({abs(a[l][0]-a[r][0]),l,r}); } U[k].erase(it); } } } REP(i,0,n)if(b[i]==inf)cout<<i+1<<"\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...