Submission #1094739

#TimeUsernameProblemLanguageResultExecution timeMemory
1094739epicci23Naval battle (CEOI24_battle)C++17
100 / 100
1627 ms161012 KiB
#include "bits/stdc++.h"
#define int long long
#define all(v) v.begin() , v.end()
#define sz(a) (int)a.size()
using namespace std;

const int INF = 1e18;

vector<bool> dead,vis;
vector<array<int,3>> v;
map<int,set<array<int,2>>> ekle[4];
map<int,set<array<int,2>>> cikar[4];
map<int,set<array<int,2>>> ver[2][2];
map<int,set<array<int,2>>> hor[2][2];

array<int,2> xd;

pair<int,vector<int>> get_min(int c,int cur=INF){
  int a=v[c][0],b=v[c][1],d=v[c][2];
  xd={b,0};
  //cout << "bakalim: " << c << ' ' << d  << '\n';
  vector<int> res;
  if(d==0){
    auto it = hor[1][b&1][a].lower_bound(xd);
    if(it!=hor[1][b&1][a].end() && cur>=((*it)[0]-b)/2){
      if(cur>((*it)[0]-b)/2) res.clear();
      cur=((*it)[0]-b)/2;
      res.push_back((*it)[1]);
    }
    it = ekle[2][a+b].lower_bound(xd);
    if(it!=ekle[2][a+b].end() && cur>=(*it)[0]-b){
      if(cur>(*it)[0]-b) res.clear();
      cur=(*it)[0]-b;
      res.push_back((*it)[1]);
    }
    it = cikar[3][a-b].lower_bound(xd);
    if(it!=cikar[3][a-b].end() && cur>=(*it)[0]-b){
      if(cur>(*it)[0]-b) res.clear();
      cur=(*it)[0]-b;
      res.push_back((*it)[1]);
    }
  }
  else if(d==1){
    auto it = hor[0][b&1][a].lower_bound(xd);
    if(it!=hor[0][b&1][a].begin() && cur>=(b-(*--it)[0])/2){
      if(cur>(b-(*it)[0])/2) res.clear();
      cur=(b-(*it)[0])/2;
      res.push_back((*it)[1]);
    }
    it = cikar[2][a-b].lower_bound(xd);
    if(it!=cikar[2][a-b].begin() && cur>=b-(*--it)[0]){
      if(cur>b-(*it)[0]) res.clear();
      cur=b-(*it)[0];
      res.push_back((*it)[1]);
    }
    it = ekle[3][a+b].lower_bound(xd);
    if(it!=ekle[3][a+b].begin() && cur>=b-(*--it)[0]){
      if(cur>b-(*it)[0]) res.clear();
      cur=b-(*it)[0];
      res.push_back((*it)[1]);
    }
  }
  else if(d==2){
    xd={a,0};
    auto it = ver[1][a&1][b].lower_bound(xd);
    if(it!=ver[1][a&1][b].end() && cur>=((*it)[0]-a)/2){
      if(cur>((*it)[0]-a)/2) res.clear();
      cur=((*it)[0]-a)/2;
      res.push_back((*it)[1]);
    }
    xd={b,0};
    it = cikar[1][a-b].lower_bound(xd);
    if(it!=cikar[1][a-b].end() && cur>=(*it)[0]-b){
      if(cur>(*it)[0]-b) res.clear();
      cur=(*it)[0]-b;
      res.push_back((*it)[1]);
    }
    it = ekle[0][a+b].lower_bound(xd);
    if(it!=ekle[0][a+b].begin() && cur>=b-(*--it)[0]){
      if(cur>b-(*it)[0]) res.clear();
      cur=b-(*it)[0];
      res.push_back((*it)[1]);
    }
  }
  else{
    xd={a,0};
    auto it = ver[0][a&1][b].lower_bound(xd);
    if(it!=ver[0][a&1][b].begin() && cur>=(a-(*--it)[0])/2){
      if(cur>(a-(*it)[0])/2) res.clear();
      cur=(a-(*it)[0])/2;
      res.push_back((*it)[1]);
    }
    xd={b,0};
    it = ekle[1][a+b].lower_bound(xd);
    if(it!=ekle[1][a+b].end() && cur>=(*it)[0]-b){
      if(cur>(*it)[0]-b) res.clear();
      cur=(*it)[0]-b;
      res.push_back((*it)[1]);
    }
    it = cikar[0][a-b].lower_bound(xd);
    if(it!=cikar[0][a-b].begin() && cur>=b-(*--it)[0]){
      if(cur>b-(*it)[0]) res.clear();
      cur=b-(*it)[0];
      res.push_back((*it)[1]);
    }
  }

  return {cur,res};
}

bool dfs(int c,int ti){
  if(dead[c] || vis[c]) return 0;
  vis[c]=1;
  //cout << "geldim: " << c << '\n';
  while(true){
   auto X = get_min(c);
   if(X.first>=ti) break;
   //cout << "lol: " << c << ' ' <<X.first << '\n';
   if(X.first<ti){
    vector<int> to_kill;
    for(int u:X.second){
      if(dfs(u,X.first)){
        to_kill.push_back(c);
        to_kill.push_back(u);
      }
    }
    for(int x:to_kill){
      if(dead[x]) continue;
      dead[x]=1;
      int a=v[x][0],b=v[x][1],d=v[x][2];
      ekle[d][a+b].erase({b,x});
      cikar[d][a-b].erase({b,x});
      if(d<=1) hor[d][b&1][a].erase({b,x});
      else ver[d-2][a&1][b].erase({a,x});
    }
    if(dead[c]) return 0;
   }
  }
  return 1;
}


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

  for(int i=0;i<n;i++){
  	int a,b,d;
  	char c;
  	cin >> b >> a >> c;
  	if(c=='E') d=0;
  	else if(c=='W') d=1; 
  	else if(c=='S') d=2;
  	else d=3;
  	v.push_back({a,b,d});
    
    ekle[d][a+b].insert({b,i});
    cikar[d][a-b].insert({b,i});
    if(d<=1) hor[d][b&1][a].insert({b,i});
    else ver[d-2][a&1][b].insert({a,i});
  }	
  dead.assign(n,0);
  vis.assign(n,0);

  for(int i=0;i<n;i++) dfs(i,INF);

  for(int i=0;i<n;i++){
    if(dead[i]) continue;
    cout << i + 1 << '\n';
  }
}

int32_t main(){
  cin.tie(0); ios::sync_with_stdio(0);
  int tc=1;//cin >> tc;
  while(tc--) _();
  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...