Submission #453709

# Submission time Handle Problem Language Result Execution time Memory
453709 2021-08-04T15:49:45 Z arminatarod Circle selection (APIO18_circle_selection) C++17
0 / 100
3000 ms 324224 KB
#include <bits/stdc++.h>

using namespace std;

constexpr int MAXN = 300005;

constexpr int MAXINT = 1073741823;

vector<int> all_numbers;

struct circles {
	int x, y, radius;
} circle[MAXN];

int sorted[MAXN], answer[MAXN];

bitset<MAXN> deleted;

set<int> segment[MAXN * 8];

bool comparison(int x, int y) {
	return (circle[x].radius == circle[y].radius? x < y : circle[x].radius > circle[y].radius);
}

void add(int from, int to, int current, int index, int value) {
	if (from > index || to < index)
		return;
	segment[current].insert(value);
	if (from == to)
		return;
	int mid = (from + to) / 2;
	add(from, mid, current * 2 + 1, index, value);
	add(mid + 1, to, current * 2 + 2, index, value);
	return;
}

void eliminate(int from, int to, int current, int index, int value) {
	if (from > index || to < index)
		return;
	segment[current].erase(value);
	if (from == to)
		return;
	int mid = (from + to) / 2;
	add(from, mid, current * 2 + 1, index, value);
	add(mid + 1, to, current * 2 + 2, index, value);
	return;
}

vector<int> selection, to_delete;

void select(int from, int to, int current, int beginning, int ending) {
	if (from > ending || to < beginning)
		return;
	else if (beginning <= from && to <= ending) {
		selection.push_back(current);
		return;
	}
	int mid = (from + to) / 2;
	select(from, mid, current * 2 + 1, beginning, ending);
	select(mid + 1, to, current * 2 + 2, beginning, ending);
	return;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	long long int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> circle[i].x >> circle[i].y >> circle[i].radius;
		all_numbers.push_back(circle[i].x - circle[i].radius);
		all_numbers.push_back(circle[i].x + circle[i].radius);
		sorted[i] = i;
	}
	sort(sorted, sorted + n, comparison);
	sort(all_numbers.begin(), all_numbers.end());
	all_numbers.resize(distance(all_numbers.begin(), unique(all_numbers.begin(), all_numbers.end())));
	for (int i = 0; i < n; i++) {
		circle[i].y = lower_bound(all_numbers.begin(), all_numbers.end(), circle[i].x + circle[i].radius) - all_numbers.begin();
		circle[i].x = lower_bound(all_numbers.begin(), all_numbers.end(), circle[i].x - circle[i].radius) - all_numbers.begin();
		add(0, all_numbers.size() - 1, 0, circle[i].x, i);
		add(0, all_numbers.size() - 1, 0, circle[i].y, i);
	}
	for (int i = 0; i < n; i++)
		if (!deleted[sorted[i]]) {
			deleted[sorted[i]] = true;
			selection.clear();
			select(0, all_numbers.size() - 1, 0, circle[sorted[i]].x, circle[sorted[i]].y);
			to_delete.clear();
			for (int j : selection)
				to_delete.insert(to_delete.end(), segment[j].begin(), segment[j].end());
			for (int j : to_delete) {
				answer[j] = sorted[i];
				deleted[j] = true;
				eliminate(0, all_numbers.size() - 1, 0, circle[j].x, j);
				eliminate(0, all_numbers.size() - 1, 0, circle[j].y, j);
			}
		}
	for (int i = 0; i < n; i++)
		cout << answer[i] + 1 << ' ';
	return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 61 ms 112964 KB Output is correct
2 Correct 61 ms 113040 KB Output is correct
3 Incorrect 68 ms 113096 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 3061 ms 309360 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 63 ms 113040 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 3076 ms 324224 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 61 ms 112964 KB Output is correct
2 Correct 61 ms 113040 KB Output is correct
3 Incorrect 68 ms 113096 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 61 ms 112964 KB Output is correct
2 Correct 61 ms 113040 KB Output is correct
3 Incorrect 68 ms 113096 KB Output isn't correct
4 Halted 0 ms 0 KB -