Submission #1235773

#TimeUsernameProblemLanguageResultExecution timeMemory
1235773trimkusNaval battle (CEOI24_battle)C++20
36 / 100
1412 ms88532 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main() {
	int N;
	cin >> N;
	map<char, int> mp = {{'E', 0}, {'S', 1}, {'W', 2}, {'N', 3}};
	vector<array<int, 3>> a(N);
	for (int i = 0; i < N; ++i) {
		cin >> a[i][0] >> a[i][1];
		char c;
		cin >> c;
		int id = mp[c];
		a[i][2] = id;
	}
	vector<map<int, set<array<int, 2>>>> coord(4);
	for (int i = 0; i < N; ++i) {
		if (a[i][2] != 1 && a[i][2] != 2) {
			coord[a[i][2]][a[i][0] + a[i][1]].insert({a[i][0], i});
		}
	}
	priority_queue<array<int, 3>> pq;
	for (int i = 0; i < N; ++i) {
		if (a[i][2] == 1) {
			set<array<int, 2>>& c = coord[0][a[i][0] + a[i][1]];
			auto it = c.upper_bound({a[i][0], -1});
			if (it != c.begin()) {
				--it;
				int tim = a[i][0] - (*it)[0];
				assert(tim > 0);
				pq.push({-tim, i, (*it)[1]});
			}
		} else if (a[i][2] == 2) {
			set<array<int, 2>>& c = coord[3][a[i][0] + a[i][1]];
			auto it = c.upper_bound({a[i][0], -1});
			if (it != c.begin()) {
				--it;
				int tim = a[i][0] - (*it)[0];
				assert(tim > 0);
				pq.push({-tim, i, (*it)[1]});
			}
		}
	}
	for (int i = 0; i < 4; ++i) coord[i].clear();
	for (int i = 0; i < N; ++i) {
		if (a[i][2] != 3 && a[i][2] != 2) {
			coord[a[i][2]][a[i][0] - a[i][1]].insert({a[i][0], i});
		}
	}
	for (int i = 0; i < N; ++i) {
		if (a[i][2] == 3) {
			set<array<int, 2>>& c = coord[0][a[i][0] - a[i][1]];
			auto it = c.upper_bound({a[i][0], -1});
			if (it != c.begin()) {
				--it;
				int tim = a[i][0] - (*it)[0];
				assert(tim > 0);
				pq.push({-tim, i, (*it)[1]});
			}
		} else if (a[i][2] == 2) {
			set<array<int, 2>>& c = coord[1][a[i][0] - a[i][1]];
			auto it = c.upper_bound({a[i][0], -1});
			if (it != c.begin()) {
				--it;
				int tim = a[i][0] - (*it)[0];
				assert(tim > 0);
				pq.push({-tim, i, (*it)[1]});
			}
		}
	}
	for (int i = 0; i < 4; ++i) coord[i].clear();
	for (int i = 0; i < N; ++i) {
		if (a[i][2] != 3 && a[i][2] != 2) {
			if (a[i][2] == 0) coord[a[i][2]][a[i][1]].insert({a[i][0], i});
			else coord[a[i][2]][a[i][0]].insert({a[i][1], i});
		}
	}
	for (int i = 0; i < N; ++i) {
		if (a[i][2] == 3) {
			set<array<int, 2>>& c = coord[1][a[i][0]];
			auto it = c.upper_bound({a[i][1], -1});
			if (it != c.end()) {
				int tim =  -a[i][1] + (*it)[0];
				assert(tim > 0 && tim % 2 == 0);
				tim /= 2;
				pq.push({-tim, i, (*it)[1]});
			}
		} else if (a[i][2] == 2) {
			set<array<int, 2>>& c = coord[1][a[i][1]];
			auto it = c.upper_bound({a[i][0], -1});
			if (it != c.begin()) {
				--it;
				int tim = a[i][0] - (*it)[0];
				assert(tim > 0);
				assert(tim % 2 == 0);
				tim /= 2;
				pq.push({-tim, i, (*it)[1]});
			}
		}
	}
	for (int i = 0; i < 4; ++i) coord[i].clear();
	vector<map<int, set<array<int, 2>>>> pos(4), neg(4), line(4);
	for (int i = 0; i < N; ++i) {
		if (a[i][2] % 2 == 0) line[a[i][2]][a[i][1]].insert({a[i][0], i});
		else line[a[i][2]][a[i][0]].insert({a[i][1], i});
		pos[a[i][2]][a[i][0] + a[i][1]].insert({a[i][0], i});
		neg[a[i][2]][a[i][0] - a[i][1]].insert({a[i][0], i});
	}
	auto del = [&](int i) -> void {
		if (a[i][2] % 2 == 0) assert(line[a[i][2]][a[i][1]].erase({a[i][0], i}));
		else assert(line[a[i][2]][a[i][0]].erase({a[i][1], i}));
		assert(pos[a[i][2]][a[i][0] + a[i][1]].erase({a[i][0], i}));
		assert(neg[a[i][2]][a[i][0] - a[i][1]].erase({a[i][0], i}));
	};
	auto ins = [&](int i) -> void {
		if (a[i][2] == 0) {
			auto& c = line[2][a[i][1]];
			auto it = c.upper_bound({a[i][0], -1});
			if (it != c.end()) {
				int tim = -a[i][0] + (*it)[0];
				assert(tim > 0 && tim % 2 == 0);
				tim /= 2;
				pq.push({-tim, i, (*it)[1]});
			}
			auto& c1 = pos[1][a[i][0] + a[i][1]];
			auto it1 = c1.upper_bound({a[i][0], -1});
			if (it1 != c1.end()) {
				int tim = -a[i][0] + (*it1)[0];
				assert(tim > 0);
				pq.push({-tim, i, (*it1)[1]});
			}
			auto& c2 = neg[3][a[i][0] - a[i][1]];
			auto it2 = c2.upper_bound({a[i][0], -1});
			if (it2 != c2.end()) {
				int tim = -a[i][0] + (*it2)[0];
				assert(tim > 0);
				pq.push({-tim, i, (*it2)[1]});
			}
		} else if (a[i][2] == 1) {
			auto& c = line[3][a[i][0]];
			auto it = c.upper_bound({a[i][1], -1});
			if (it != c.begin()) {
				it--;
				int tim = a[i][1] - (*it)[0];
				assert(tim > 0 && tim % 2 == 0);
				tim /= 2;
				pq.push({-tim, i, (*it)[1]});
			}
			auto& c1 = pos[0][a[i][0] + a[i][1]];
			auto it1 = c1.upper_bound({a[i][0], -1});
			if (it1 != c1.begin()) {
				it1--;
				int tim = a[i][0] - (*it1)[0];
				assert(tim > 0);
				pq.push({-tim, i, (*it1)[1]});
			}
			auto& c2 = neg[2][a[i][0] - a[i][1]];
			auto it2 = c2.upper_bound({a[i][0], -1});
			if (it2 != c2.end()) {
				int tim = -a[i][0] + (*it2)[0];
				assert(tim > 0);
				pq.push({-tim, i, (*it2)[1]});
			}
		} else if (a[i][2] == 2) {
			auto& c = line[0][a[i][1]];
			auto it = c.upper_bound({a[i][0], -1});
			if (it != c.begin()) {
				it--;
				int tim = a[i][0] - (*it)[0];
				assert(tim > 0 && tim % 2 == 0);
				tim /= 2;
				pq.push({-tim, i, (*it)[1]});
			}
			auto& c1 = pos[3][a[i][0] + a[i][1]];
			auto it1 = c1.upper_bound({a[i][0], -1});
			if (it1 != c1.begin()) {
				it1--;
				int tim = a[i][0] - (*it1)[0];
				assert(tim > 0);
				pq.push({-tim, i, (*it1)[1]});
			}
			auto& c2 = neg[1][a[i][0] - a[i][1]];
			auto it2 = c2.upper_bound({a[i][0], -1});
			if (it2 != c2.begin()) {
				it2--;
				int tim = a[i][0] - (*it2)[0];
				assert(tim > 0);
				pq.push({-tim, i, (*it2)[1]});
			}
		} else {
			auto& c = line[1][a[i][0]];
			auto it = c.upper_bound({a[i][1], -1});
			if (it != c.end()) {
				int tim = -a[i][1] + (*it)[0];
				assert(tim > 0 && tim % 2 == 0);
				tim /= 2;
				pq.push({-tim, i, (*it)[1]});
			}
			auto& c1 = pos[2][a[i][0] + a[i][1]];
			auto it1 = c1.upper_bound({a[i][0], -1});
			if (it1 != c1.end()) {
				int tim = -a[i][0] + (*it1)[0];
				assert(tim > 0);
				pq.push({-tim, i, (*it1)[1]});
			}
			auto& c2 = neg[0][a[i][0] - a[i][1]];
			auto it2 = c2.upper_bound({a[i][0], -1});
			if (it2 != c2.begin()) {
				it2--;
				int tim = -a[i][0] + (*it2)[0];
				assert(tim > 0);
				pq.push({-tim, i, (*it2)[1]});
			}
		}
	};
	int timer = 1;
	// auto nq = pq;
	// while (nq.size()) {
	// 	cout << -nq.top()[0] << " " << nq.top()[1] + 1 << " " << nq.top()[2] + 1 << "\n";
	// 	nq.pop();
	// }
	// ofstream cout("out.txt");
	unordered_set<int> deleted;
	while (pq.size()) {
		int d = -pq.top()[0];
		vector<int> recalc;
		vector<int> todel;
		while (pq.size() && -pq.top()[0] == d) {
			int i = pq.top()[1];
			int j = pq.top()[2];
			pq.pop();
			// cout << d << " = " << i + 1 << " " << j + 1 << " = " << deleted.count(i) << " " << deleted.count(j) << "\n";
			// if (i + 1 == 70 && j + 1 == 1) break;
			// if (deleted.count(i) || deleted.count(j)) continue;
			if (deleted.count(i) && !deleted.count(j)) recalc.push_back(j);
			else if (deleted.count(j) && !deleted.count(i)) recalc.push_back(i);
			else if (!deleted.count(j) && !deleted.count(i)) {
				todel.push_back(i);
				todel.push_back(j);
			}
		}
		sort(begin(todel), end(todel));
		todel.erase(unique(begin(todel), end(todel)), end(todel));
		for (auto& u : todel) {
			del(u);
			deleted.insert(u);
		}
		// cout << pq.size() << " -> ";
		for (auto& u : recalc) {
			ins(u);
		}
		// cout << pq.size() << "\n";
		// cout << "end\n";
	}
	for (int i = 0; i < N; ++i) {
		if (!deleted.count(i)) {
			cout << i + 1 << "\n";
		}
	}
}
#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...