Submission #1134345

#TimeUsernameProblemLanguageResultExecution timeMemory
1134345amunduzbaevNaval battle (CEOI24_battle)C++20
100 / 100
1337 ms89400 KiB
#include "bits/stdc++.h"

using namespace std;

//~ #define int ll
typedef long long ll;
#define ar array

template<class T> bool umin(T& a, T b) { if(b < a) { a = b; return true; } return false; }
template<class T> bool umax(T& a, T b) { if(a < b) { a = b; return true; } return false; }

//~ const int mod = 1e9 + 7;
//~ void add(int& a, const int b){
	//~ a += b;
	//~ while(a >= mod) a -= mod;
	//~ while(a < 0) a += mod;
//~ }

const int inf = 1e9 + 5;

void solve(){
	int n; cin >> n;
	
	vector<int> x(n), y(n), d(n);
	
	vector<ar<int, 2>> coll[3] = {
		{ {0, 3}, {1, 2} },
		{ {2, 3}, {1, 0} },
		{ {1, 3}, {2, 0} }
	};
	
	for(int i=0;i<n;i++){
		char c;
		cin >> x[i] >> y[i] >> c;
		
		if(c == 'N') d[i] = 0;
		if(c == 'E') d[i] = 1;
		if(c == 'S') d[i] = 2;
		if(c == 'W') d[i] = 3;
	}
	
	auto check = [&](int i, int j){
		if(x[i] > x[j]) swap(i, j);
		if(x[i] == x[j] && y[i] > y[j]) swap(i, j);
		ar<int, 2> d_ = {d[i], d[j]};
		
		if(x[i] + y[i] == x[j] + y[j] && (d_ == coll[0][0] || d_ == coll[0][1])){
			return abs(x[i] - x[j]);
		}
		if(x[i] - y[i] == x[j] - y[j] && (d_ == coll[1][0] || d_ == coll[1][1])) {
			return abs(x[i] - x[j]);
		}
		if(d_ == coll[2][0] && y[i] == y[j]) return (x[j] - x[i]) / 2;
		if(d_ == coll[2][1] && x[i] == x[j]) return (y[j] - y[i]) / 2;
		
		return inf + 1;
	};
	
	map<int, set<ar<int, 2>>> d1[2], d2[2];
	map<int, set<ar<int, 2>>> ver, hor;
	
	for(int i=0;i<n;i++){
		bool f = d[i] == 0 || d[i] == 3;
		//~ cout<<i<<" "<<f<<"\n";
		d1[f][x[i] + y[i]].insert({x[i], i});
		d2[d[i] < 2][x[i] - y[i]].insert({x[i], i});
		if(d[i] % 2 == 0) ver[x[i]].insert({y[i], i});
		if(d[i] % 2 == 1) hor[y[i]].insert({x[i], i});
	}
	
	//~ for(auto x : d1[0][12]){
		//~ cout<<x<<" ";
	//~ }cout<<"\n";
	
	priority_queue<ar<int, 3>, vector<ar<int, 3>>, greater<ar<int, 3>> > mn;
	
	auto err = [&](set<ar<int, 2>>& s, int v, int i){
		s.erase({v, i});
		auto it = s.upper_bound({v, i});
		if(it != s.end() && it != s.begin()){
			int r = (*it)[1]; --it;
			int l = (*it)[1];
			mn.push({check(l, r), l, r});
		}
	};
	
	auto upd = [&](int i){
		bool f = d[i] == 0 || d[i] == 3;
		err(d1[f][x[i] + y[i]], x[i], i);
		err(d2[d[i] < 2][x[i] - y[i]], x[i], i);
		if(d[i] % 2 == 0) err(ver[x[i]], y[i], i); // ver[x[i]].insert(i);
		if(d[i] % 2 == 1) err(hor[y[i]], x[i], i); // hor[y[i]].insert(i);
	};
	
	auto calc = [&](set<ar<int, 2>>& s){
		int prev = -1;
		for(auto [x, i] : s){
			if(prev != -1){
				//~ cout<<prev<<" "<<i<<" "<<check(prev, i)<<"\n";
				mn.push({check(prev, i), i, prev});
			}
			
			prev = i;
		}
	};
	
	for(int t=0;t<2;t++){
		for(auto [dg, s] : d1[t]){ calc(s); }
		for(auto [dg, s] : d2[t]){ calc(s); }
	}
	for(auto [lin, s] : ver) { calc(s); }
	for(auto [lin, s] : hor) { calc(s); }
	
	vector<int> liv(n, 1);
	while(!mn.empty()){
		vector<ar<int, 3>> curr;
		auto [dis, unused_i, unused_j] = mn.top(); 
		if(dis > inf) break;
		
		while(!mn.empty() && mn.top()[0] == dis){
			curr.push_back(mn.top());
			mn.pop();
		}
		
		vector<int> to_upd;
		for(auto [dis, i, j] : curr){
			if(!liv[i] || !liv[j]) continue;
			
			to_upd.push_back(i);
			to_upd.push_back(j);
		}
		
		for(auto x : to_upd){
			if(liv[x]){
				liv[x] = 0;
				upd(x);
			}
		}
	}
	
	for(int i=0;i<n;i++){
		if(liv[i]) cout<<i + 1<<"\n";
	}
	
}

signed main(){
	ios_base::sync_with_stdio(0); cin.tie(0);
	
	int 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...