답안 #854740

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
854740 2023-09-28T17:23:58 Z dlalswp25 원 고르기 (APIO18_circle_selection) C++17
87 / 100
3000 ms 239864 KB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>

using namespace std;
typedef pair<int, int> pii;

const int K = 2;

int N;
int X[303030];
int Y[303030];
int R[303030];
int XL[303030];
int XR[303030];
int ans[303030];
int cur;
char rr;

void rf(int &x) {
	x = 0;
	int sgn = 0;
	while (rr < 48 && rr != '-') rr = getchar();
	if (rr == '-') { sgn = 1; rr = getchar(); }
	while (47 < rr) { x = (x << 3) + (x << 1) + (rr & 15); rr = getchar(); }
	if (sgn) x = -x;
}

inline bool intersect(int i, int j) {
	long long dx = X[i] - X[j], dy = Y[i] - Y[j], r = R[i] + R[j];
	return dx * dx + dy * dy <= r * r;
}

inline void chk(int cand) {
	int &t = ans[cur];
	if (R[cand] < R[t] || (R[cand] == R[t] && cand > t)) return;
	if (intersect(cur, cand)) t = cand;
}

struct SegTree {
	struct Node {
		set<pii> s;
	};

	int n, base;
	vector<Node> T;
	vector<int> L;

	SegTree(int _n) : n(_n) {
		for (base = 1; base < n; base <<= 1);
		T.resize(base + base);
		L.resize(base + base);
		for (int i = base; i < base + base; i++) L[i] = i - base + 1;
		for (int i = base - 1; i >= 1; i--) L[i] = L[i << 1];
	}

	void chk_node(int idx, int y, int r, int li) {
		auto it = T[idx].s.lower_bound({y, 0});
		auto tmp = it;
		for (int i = 0; i < K; i++) {
			if (it == T[idx].s.end()) break;
			if (XL[it->second] <= li) break;
			chk(it->second);
			if (it->first >= (long long)y + r + r) break;
			if (i < K - 1) it++;
		}
		it = tmp;
		for (int i = 0; i < K; i++) {
			if (it == T[idx].s.begin()) break;
			it--;
			if (XL[it->second] <= li) break;
			chk(it->second);
			if (it->first <= (long long)y - r - r) break;
		}
	}

	void upd(int p, int q, pii x) {
		p += base; q += base;
		p--; q--;
		while (p <= q) {
			if (p & 1) T[p++].s.insert(x);
			if (~q & 1) T[q--].s.insert(x);
			p >>= 1; q >>= 1;
		}
	}

	void get(int p, int y, int r, int li) {
		p += base; p--;
		while (p >= 1) {
			if (L[p] <= li) break;
			chk_node(p, y, r, li);
			p >>= 1;
		}
	}
};

int main() {
	rf(N);
	vector<int> v;
	for (int i = 1; i <= N; i++) {
		rf(X[i]); rf(Y[i]); rf(R[i]);
		XL[i] = X[i] - R[i], XR[i] = X[i] + R[i];
		v.push_back(XL[i]);
		v.push_back(XR[i]);
	}
	sort(v.begin(), v.end());
	v.erase(unique(v.begin(), v.end()), v.end());
	for (int i = 1; i <= N; i++) {
		XL[i] = lower_bound(v.begin(), v.end(), XL[i]) - v.begin() + 1;
		XR[i] = lower_bound(v.begin(), v.end(), XR[i]) - v.begin() + 1;
	}

	int M = v.size();
	SegTree seg(M);

	vector<int> idx(N);
	iota(idx.begin(), idx.end(), 1);
	sort(idx.begin(), idx.end(), [&](int a, int b) {
		return pii(R[a], -a) > pii(R[b], -b);
	});

	for (int i : idx) {
		cur = i;
		ans[i] = i;
		seg.get(XL[i], Y[i], R[i], 0);
		seg.get(XR[i], Y[i], R[i], XL[i]);
		if (ans[i] == i) seg.upd(XL[i], XR[i], {Y[i], i});
	}

	for (int i = 1; i <= N; i++) printf("%d ", ans[i]); puts("");
	return 0;
}

Compilation message

circle_selection.cpp: In function 'int main()':
circle_selection.cpp:129:2: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
  129 |  for (int i = 1; i <= N; i++) printf("%d ", ans[i]); puts("");
      |  ^~~
circle_selection.cpp:129:54: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  129 |  for (int i = 1; i <= N; i++) printf("%d ", ans[i]); puts("");
      |                                                      ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6488 KB Output is correct
2 Correct 1 ms 6488 KB Output is correct
3 Correct 1 ms 6492 KB Output is correct
4 Correct 1 ms 6492 KB Output is correct
5 Correct 1 ms 6596 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 1 ms 6492 KB Output is correct
8 Correct 1 ms 6492 KB Output is correct
9 Correct 1 ms 6492 KB Output is correct
10 Correct 1 ms 6492 KB Output is correct
11 Correct 1 ms 6492 KB Output is correct
12 Correct 2 ms 6492 KB Output is correct
13 Correct 1 ms 6492 KB Output is correct
14 Correct 1 ms 6492 KB Output is correct
15 Correct 1 ms 6492 KB Output is correct
16 Correct 1 ms 6744 KB Output is correct
17 Correct 1 ms 6748 KB Output is correct
18 Correct 1 ms 6744 KB Output is correct
19 Correct 5 ms 8280 KB Output is correct
20 Correct 5 ms 8240 KB Output is correct
21 Correct 5 ms 8284 KB Output is correct
22 Correct 5 ms 8796 KB Output is correct
23 Correct 9 ms 9564 KB Output is correct
24 Correct 5 ms 8796 KB Output is correct
25 Correct 5 ms 8540 KB Output is correct
26 Correct 5 ms 8796 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 358 ms 119992 KB Output is correct
2 Correct 368 ms 121220 KB Output is correct
3 Correct 364 ms 120504 KB Output is correct
4 Correct 355 ms 119732 KB Output is correct
5 Correct 300 ms 68148 KB Output is correct
6 Correct 361 ms 131996 KB Output is correct
7 Correct 342 ms 122512 KB Output is correct
8 Correct 349 ms 125624 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6488 KB Output is correct
2 Correct 254 ms 57472 KB Output is correct
3 Correct 930 ms 186728 KB Output is correct
4 Correct 921 ms 186120 KB Output is correct
5 Correct 1190 ms 184528 KB Output is correct
6 Correct 402 ms 86036 KB Output is correct
7 Correct 129 ms 44288 KB Output is correct
8 Correct 16 ms 14548 KB Output is correct
9 Correct 1029 ms 188480 KB Output is correct
10 Correct 1494 ms 179504 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 685 ms 176568 KB Output is correct
2 Correct 306 ms 140984 KB Output is correct
3 Correct 665 ms 127332 KB Output is correct
4 Correct 345 ms 145844 KB Output is correct
5 Correct 330 ms 143800 KB Output is correct
6 Correct 569 ms 122040 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6488 KB Output is correct
2 Correct 1 ms 6488 KB Output is correct
3 Correct 1 ms 6492 KB Output is correct
4 Correct 1 ms 6492 KB Output is correct
5 Correct 1 ms 6596 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 1 ms 6492 KB Output is correct
8 Correct 1 ms 6492 KB Output is correct
9 Correct 1 ms 6492 KB Output is correct
10 Correct 1 ms 6492 KB Output is correct
11 Correct 1 ms 6492 KB Output is correct
12 Correct 2 ms 6492 KB Output is correct
13 Correct 1 ms 6492 KB Output is correct
14 Correct 1 ms 6492 KB Output is correct
15 Correct 1 ms 6492 KB Output is correct
16 Correct 1 ms 6744 KB Output is correct
17 Correct 1 ms 6748 KB Output is correct
18 Correct 1 ms 6744 KB Output is correct
19 Correct 5 ms 8280 KB Output is correct
20 Correct 5 ms 8240 KB Output is correct
21 Correct 5 ms 8284 KB Output is correct
22 Correct 5 ms 8796 KB Output is correct
23 Correct 9 ms 9564 KB Output is correct
24 Correct 5 ms 8796 KB Output is correct
25 Correct 5 ms 8540 KB Output is correct
26 Correct 5 ms 8796 KB Output is correct
27 Correct 8 ms 10076 KB Output is correct
28 Correct 8 ms 10076 KB Output is correct
29 Correct 8 ms 10152 KB Output is correct
30 Correct 13 ms 11868 KB Output is correct
31 Correct 9 ms 11100 KB Output is correct
32 Correct 9 ms 10920 KB Output is correct
33 Correct 90 ms 35160 KB Output is correct
34 Correct 94 ms 35012 KB Output is correct
35 Correct 101 ms 35020 KB Output is correct
36 Correct 143 ms 47688 KB Output is correct
37 Correct 145 ms 48152 KB Output is correct
38 Correct 162 ms 50324 KB Output is correct
39 Correct 114 ms 11760 KB Output is correct
40 Correct 109 ms 11432 KB Output is correct
41 Correct 110 ms 11616 KB Output is correct
42 Correct 120 ms 11716 KB Output is correct
43 Correct 97 ms 41928 KB Output is correct
44 Correct 90 ms 41308 KB Output is correct
45 Correct 92 ms 41820 KB Output is correct
46 Correct 98 ms 41748 KB Output is correct
47 Correct 97 ms 41412 KB Output is correct
48 Correct 92 ms 41812 KB Output is correct
49 Correct 88 ms 40644 KB Output is correct
50 Correct 91 ms 41304 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6488 KB Output is correct
2 Correct 1 ms 6488 KB Output is correct
3 Correct 1 ms 6492 KB Output is correct
4 Correct 1 ms 6492 KB Output is correct
5 Correct 1 ms 6596 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 1 ms 6492 KB Output is correct
8 Correct 1 ms 6492 KB Output is correct
9 Correct 1 ms 6492 KB Output is correct
10 Correct 1 ms 6492 KB Output is correct
11 Correct 1 ms 6492 KB Output is correct
12 Correct 2 ms 6492 KB Output is correct
13 Correct 1 ms 6492 KB Output is correct
14 Correct 1 ms 6492 KB Output is correct
15 Correct 1 ms 6492 KB Output is correct
16 Correct 1 ms 6744 KB Output is correct
17 Correct 1 ms 6748 KB Output is correct
18 Correct 1 ms 6744 KB Output is correct
19 Correct 5 ms 8280 KB Output is correct
20 Correct 5 ms 8240 KB Output is correct
21 Correct 5 ms 8284 KB Output is correct
22 Correct 5 ms 8796 KB Output is correct
23 Correct 9 ms 9564 KB Output is correct
24 Correct 5 ms 8796 KB Output is correct
25 Correct 5 ms 8540 KB Output is correct
26 Correct 5 ms 8796 KB Output is correct
27 Correct 358 ms 119992 KB Output is correct
28 Correct 368 ms 121220 KB Output is correct
29 Correct 364 ms 120504 KB Output is correct
30 Correct 355 ms 119732 KB Output is correct
31 Correct 300 ms 68148 KB Output is correct
32 Correct 361 ms 131996 KB Output is correct
33 Correct 342 ms 122512 KB Output is correct
34 Correct 349 ms 125624 KB Output is correct
35 Correct 1 ms 6488 KB Output is correct
36 Correct 254 ms 57472 KB Output is correct
37 Correct 930 ms 186728 KB Output is correct
38 Correct 921 ms 186120 KB Output is correct
39 Correct 1190 ms 184528 KB Output is correct
40 Correct 402 ms 86036 KB Output is correct
41 Correct 129 ms 44288 KB Output is correct
42 Correct 16 ms 14548 KB Output is correct
43 Correct 1029 ms 188480 KB Output is correct
44 Correct 1494 ms 179504 KB Output is correct
45 Correct 685 ms 176568 KB Output is correct
46 Correct 306 ms 140984 KB Output is correct
47 Correct 665 ms 127332 KB Output is correct
48 Correct 345 ms 145844 KB Output is correct
49 Correct 330 ms 143800 KB Output is correct
50 Correct 569 ms 122040 KB Output is correct
51 Correct 8 ms 10076 KB Output is correct
52 Correct 8 ms 10076 KB Output is correct
53 Correct 8 ms 10152 KB Output is correct
54 Correct 13 ms 11868 KB Output is correct
55 Correct 9 ms 11100 KB Output is correct
56 Correct 9 ms 10920 KB Output is correct
57 Correct 90 ms 35160 KB Output is correct
58 Correct 94 ms 35012 KB Output is correct
59 Correct 101 ms 35020 KB Output is correct
60 Correct 143 ms 47688 KB Output is correct
61 Correct 145 ms 48152 KB Output is correct
62 Correct 162 ms 50324 KB Output is correct
63 Correct 114 ms 11760 KB Output is correct
64 Correct 109 ms 11432 KB Output is correct
65 Correct 110 ms 11616 KB Output is correct
66 Correct 120 ms 11716 KB Output is correct
67 Correct 97 ms 41928 KB Output is correct
68 Correct 90 ms 41308 KB Output is correct
69 Correct 92 ms 41820 KB Output is correct
70 Correct 98 ms 41748 KB Output is correct
71 Correct 97 ms 41412 KB Output is correct
72 Correct 92 ms 41812 KB Output is correct
73 Correct 88 ms 40644 KB Output is correct
74 Correct 91 ms 41304 KB Output is correct
75 Correct 379 ms 120760 KB Output is correct
76 Correct 372 ms 120016 KB Output is correct
77 Correct 331 ms 120904 KB Output is correct
78 Correct 344 ms 120336 KB Output is correct
79 Correct 457 ms 121784 KB Output is correct
80 Correct 356 ms 119988 KB Output is correct
81 Correct 834 ms 181488 KB Output is correct
82 Correct 702 ms 171704 KB Output is correct
83 Correct 695 ms 171716 KB Output is correct
84 Correct 1148 ms 197140 KB Output is correct
85 Correct 790 ms 177680 KB Output is correct
86 Correct 679 ms 170092 KB Output is correct
87 Correct 2657 ms 239864 KB Output is correct
88 Correct 410 ms 26504 KB Output is correct
89 Correct 405 ms 26556 KB Output is correct
90 Correct 399 ms 25256 KB Output is correct
91 Correct 393 ms 25268 KB Output is correct
92 Correct 409 ms 26016 KB Output is correct
93 Correct 351 ms 148408 KB Output is correct
94 Correct 2874 ms 97584 KB Output is correct
95 Correct 343 ms 149276 KB Output is correct
96 Correct 352 ms 149900 KB Output is correct
97 Correct 2131 ms 74404 KB Output is correct
98 Correct 381 ms 140316 KB Output is correct
99 Correct 342 ms 148532 KB Output is correct
100 Correct 337 ms 148156 KB Output is correct
101 Correct 497 ms 151448 KB Output is correct
102 Correct 350 ms 149412 KB Output is correct
103 Execution timed out 3021 ms 90776 KB Time limit exceeded
104 Halted 0 ms 0 KB -