제출 #1237278

#제출 시각아이디문제언어결과실행 시간메모리
1237278GrayNaval battle (CEOI24_battle)C++20
46 / 100
3098 ms127028 KiB
#include<bits/stdc++.h> #define ll long long #define ff first #define ss second #define ln "\n" using namespace std; const ll INF = 2e18; void solve(){ ll n; cin >> n; vector<array<ll, 3>> a(n); vector<map<ll, set<pair<ll, ll>>>> dir(4); vector<map<ll, set<pair<ll, ll>>>> diag1(4), diag2(4); for (ll i=0; i<n; i++){ cin >> a[i][0] >> a[i][1]; swap(a[i][0], a[i][1]); char x; cin >> x; if (x=='N') { a[i][2]=0; dir[a[i][2]][a[i][1]].insert({a[i][0], i}); } else if (x=='E') { a[i][2]=1; dir[a[i][2]][a[i][0]].insert({a[i][1], i}); } else if (x=='S') { a[i][2]=2; dir[a[i][2]][a[i][1]].insert({a[i][0], i}); } else { a[i][2]=3; dir[a[i][2]][a[i][0]].insert({a[i][1], i}); } diag1[a[i][2]][a[i][0]+a[i][1]].insert({a[i][1], i}); diag2[a[i][2]][a[i][0]-a[i][1]].insert({a[i][1], i}); } set<ll> left; for (ll i=0; i<n; i++) left.insert(i); while (!left.empty()){ ll mn=INF; set<ll> infl; for (ll i=1; i<=2; i++){ for (auto &[di, st]:dir[i]){ for (auto [num, ind]:st){ ll adi = (i+2)%4; auto iter = dir[adi][di].lower_bound({num, INF}); if (iter!=dir[adi][di].end()) { if (mn>(*iter).ff-num){ mn=(*iter).ff-num; infl.clear(); infl.insert(ind); infl.insert((*iter).ss); }else if (mn==(*iter).ff-num){ infl.insert(ind); infl.insert((*iter).ss); } } } } } for (auto ldi:{0, 1}){ ll adi = (ldi==0?3:2); for (auto &[x, st]:diag1[ldi]){ for (auto [num, ind]:st){ auto iter = diag1[adi][x].lower_bound({num, INF}); if (iter!=diag1[adi][x].end()){ if (mn>((*iter).ff-num)*2){ mn=((*iter).ff-num)*2; infl.clear(); infl.insert(ind); infl.insert((*iter).ss); }else if (mn==((*iter).ff-num)*2){ infl.insert(ind); infl.insert((*iter).ss); } } } } } for (auto ldi:{1, 2}){ ll adi = (ldi==2?3:0); for (auto &[x, st]:diag2[ldi]){ for (auto [num, ind]:st){ auto iter = diag2[adi][x].lower_bound({num, INF}); if (iter!=diag2[adi][x].end()){ if (mn>((*iter).ff-num)*2){ mn=((*iter).ff-num)*2; infl.clear(); infl.insert(ind); infl.insert((*iter).ss); }else if (mn==((*iter).ff-num)*2){ infl.insert(ind); infl.insert((*iter).ss); } } } } } if (infl.empty()) break; for (auto ind:infl){ dir[a[ind][2]][(a[ind][2]%2?a[ind][0]:a[ind][1])].erase({(a[ind][2]%2?a[ind][1]:a[ind][0]), ind}); diag1[a[ind][2]][a[ind][1]+a[ind][0]].erase({a[ind][1], ind}); diag2[a[ind][2]][a[ind][0]-a[ind][1]].erase({a[ind][1], ind}); left.erase(ind); } } for (auto x:left) cout << x+1 << ln; } int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); ll t=1; // cin >> t; while (t--){ solve(); } }
#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...