제출 #1098711

#제출 시각아이디문제언어결과실행 시간메모리
1098711MighilonNaval battle (CEOI24_battle)C++17
100 / 100
2058 ms201572 KiB
#include <bits/stdc++.h> using namespace std; #ifdef DEBUG #include "../Library/debug.h" #else #define dbg(x...) #endif typedef long long ll; typedef long double ld; typedef pair<int, int> pi; typedef pair<ll, ll> pl; typedef vector<int> vi; typedef vector<bool> vb; typedef vector<ll> vl; typedef vector<pi> vpi; typedef vector<pl> vpl; #define FOR(i, a, b) for (int i = (a); i < (b); ++i) #define F0R(i, a) for (int i = 0; i < (a); ++i) #define FORd(i, a, b) for (int i = (b) - 1; i >= (a); --i) #define F0Rd(i, a) for (int i = (a) - 1; i >= 0; --i) #define trav(a, x) for (auto& a : x) #define f first #define s second #define pb push_back #define sz(x) (int)(x).size() #define all(x) x.begin(), x.end() const char nl = '\n'; const int INF = 1e9; const int MOD = 1e9 + 7; const int mxN=1e7+1; struct Point{ int sign, pos, id; }; bool operator<(Point&a,Point&b){ return a.pos<b.pos; } struct Bad{ int id1, id2, t; }; bool operator<(const Bad&a,const Bad&b){ return a.t<b.t; } priority_queue<Bad> pq; void check(Point&a,Point&b){ if(a.sign==1&&b.sign==-1) pq.push({a.id, b.id, a.pos-b.pos}); } struct myList{ list<Point> li; map<int, list<Point>::iterator> rit; void init(){ vector<Point> a(all(li)); sort(all(a)); li=list<Point>(all(a)); for(auto it=li.begin();it!=li.end();++it){ rit[it->id]=it; if(next(it)!=li.end()) check(*it,*next(it)); } } void erase(int id){ if(rit.find(id)!=rit.end()){ auto it=rit[id]; it=li.erase(it); if(it!=li.begin()&&it!=li.end()){ check(*prev(it),*it); } } } }; vector<map<int,myList>> lis(6); vector<bool> p; void insert(int t,int id,int x, int y,int sign){ lis[t][x].li.push_back({sign,y,id}); } void solve(){ int n; cin>>n; p.resize(n,1); vpi a(n); F0R(i,n){ int x,y;char c; cin>>x>>y>>c; if(c=='N'||c=='S')insert(0,i,x,y,c=='S'?1:-1); if(c=='W'||c=='E')insert(1,i,y,x,c=='E'?1:-1); if(c=='S'||c=='W')insert(2,i,x-y,x+y,c=='S'?1:-1); if(c=='W'||c=='N')insert(3,i,x+y,x-y,c=='N'?1:-1); if(c=='N'||c=='E')insert(4,i,x-y,x+y,c=='E'?1:-1); if(c=='E'||c=='S')insert(5,i,x+y,x-y,c=='E'?1:-1); a[i]={x,y}; } F0R(i,6){ trav(j,lis[i]){ j.s.init(); } } while(!pq.empty()){ int t=pq.top().t; vi e; while(!pq.empty()&&pq.top().t==t){ auto [i,j,t2]=pq.top(); pq.pop(); if(p[i]&&p[j]){ e.pb(i); e.pb(j); } } sort(all(e)); e.erase(unique(all(e)),e.end()); dbg(e); trav(i,e){ p[i]=0; lis[0][a[i].f].erase(i); lis[1][a[i].s].erase(i); lis[2][a[i].f-a[i].s].erase(i); lis[3][a[i].f+a[i].s].erase(i); lis[4][a[i].f-a[i].s].erase(i); lis[5][a[i].f+a[i].s].erase(i); } while(!pq.empty()){ if(p[pq.top().id1]&&p[pq.top().id2])break; else pq.pop(); } } F0R(i,n){ if(p[i]) cout<<i+1<<nl; } } int32_t main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int TC = 1; // cin >> TC; while(TC--){ 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...