제출 #1290043

#제출 시각아이디문제언어결과실행 시간메모리
1290043loomNaval battle (CEOI24_battle)C++20
100 / 100
1008 ms101908 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf (int)5e18
#define nl '\n'

void solve(){
   int n;
   cin>>n;

   map<int, set<array<int,3>>> mp[6];
   vector<tuple<int,int,char>> v(n);

   for(int i = 0; i < n; i++){
      auto &[x, y, d] = v[i];
      cin>>x>>y>>d;
      swap(x, y);

      if(d == 'E'){
         mp[0][x-y].insert({x, 0, i});
         mp[1][x+y].insert({x, 1, i});
         mp[2][x].insert({y/2, 0, i});
      }
      if(d == 'N'){
         mp[0][x-y].insert({x, 1, i});
         mp[3][y].insert({x/2, 1, i});
         mp[4][x+y].insert({x, 1, i});
      }
      if(d == 'S'){
         mp[1][x+y].insert({x, 0, i});
         mp[3][y].insert({x/2, 0, i});
         mp[5][x-y].insert({x, 0, i});
      }
      if(d == 'W'){
         mp[2][x].insert({y/2, 1, i});
         mp[4][x+y].insert({x, 0, i});
         mp[5][x-y].insert({x, 1, i});
      }
   }

   priority_queue<array<int,3>, vector<array<int,3>>, greater<array<int,3>>> pq;

   for(int w = 0; w < 6; w++){
      for(auto &[x, st] : mp[w]){
         auto pit = st.begin(), it = st.begin();

         while(++it != st.end()){
            auto [p1, d1, i1] = *pit;
            auto [p2, d2, i2] = *it;

            if(!d1 and d2) pq.push({p2 - p1, i1, i2});
            pit++;
         }
      }
   }

   auto del = [&](int m, int w, int p, int d, int i){
      auto &st = mp[m][w];
      auto it = st.find({p, d, i});
      
      it = st.erase(it);
      if(it == st.begin() or it == st.end()) return;
      auto pit = prev(it);

      auto [p1, d1, i1] = *pit;
      auto [p2, d2, i2] = *it;

      if(!d1 and d2) pq.push({p2 - p1, i1, i2});
   };

   auto rem = [&](int i){
      auto [x, y, d] = v[i];

      if(d == 'E'){
         del(0, x-y, x, 0, i);
         del(1, x+y, x, 1, i);
         del(2, x, y/2, 0, i);
      }
      if(d == 'N'){
         del(0, x-y, x, 1, i);
         del(3, y, x/2, 1, i);
         del(4, x+y, x, 1, i);
      }
      if(d == 'S'){
         del(1, x+y, x, 0, i);
         del(3, y, x/2, 0, i);
         del(5, x-y, x, 0, i);
      }
      if(d == 'W'){
         del(2, x, y/2, 1, i);
         del(4, x+y, x, 0, i);
         del(5, x-y, x, 1, i);
      }
   };

   vector<int> dt(n);

   while(!pq.empty()){
      auto [t, i1, i2] = pq.top();
      pq.pop();

      if((dt[i1] or dt[i2]) and dt[i1] != t and dt[i2] != t) continue;

      if(!dt[i1]) rem(i1);
      if(!dt[i2]) rem(i2);
      dt[i1] = dt[i2] = t;
   }

   for(int i = 0; i < n; i++) if(!dt[i]) cout<<i+1<<nl;
}

signed main(){
   ios_base::sync_with_stdio(0);
   cin.tie(NULL);cout.tie(NULL);

   int t = 1;
   //cin>>t;
   while(t--) 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...