답안 #855940

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
855940 2023-10-02T11:00:34 Z dlalswp25 원 고르기 (APIO18_circle_selection) C++17
87 / 100
3000 ms 323276 KB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>

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

// const int K = 2;
const int LIM = 10;

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 {
		vector<pii> v;
		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) {
		if (T[idx].s.size() > LIM) {
			auto it = T[idx].s.lower_bound({y, 0});
			auto tmp = it;
			if (it != T[idx].s.end()) {
				chk(it->second);
				if (it->first - y < r) {
					++it;
					if (it != T[idx].s.end()) chk(it->second);
				}
			}
			it = tmp;
			if (it != T[idx].s.begin()) {
				--it;
				chk(it->second);
				if (it->first - y > -r && it != T[idx].s.begin()) {
					chk(prev(it)->second);
				}
			}
		} else {
			for (pii i : T[idx].v) chk(i.second);
		}
	}

	void upd(int p, int q, pii x) {
		p += base; q += base;
		p--; q--;
		while (p <= q) {
			if (p & 1) {
				if (T[p].v.size() < LIM) T[p].v.push_back(x);
				T[p++].s.insert(x);
			}
			if (~q & 1) {
				if (T[q].v.size() < LIM) T[q].v.push_back(x);
				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 << 1);
			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:141:2: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
  141 |  for (int i = 1; i <= N; i++) printf("%d ", ans[i]); puts("");
      |  ^~~
circle_selection.cpp:141:54: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  141 |  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 6492 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 6488 KB Output is correct
10 Correct 1 ms 6492 KB Output is correct
11 Correct 1 ms 6492 KB Output is correct
12 Correct 1 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 6488 KB Output is correct
16 Correct 1 ms 6748 KB Output is correct
17 Correct 1 ms 6748 KB Output is correct
18 Correct 2 ms 6748 KB Output is correct
19 Correct 5 ms 9052 KB Output is correct
20 Correct 5 ms 9204 KB Output is correct
21 Correct 5 ms 9052 KB Output is correct
22 Correct 7 ms 9816 KB Output is correct
23 Correct 10 ms 10844 KB Output is correct
24 Correct 6 ms 9820 KB Output is correct
25 Correct 5 ms 9568 KB Output is correct
26 Correct 6 ms 9820 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 387 ms 168936 KB Output is correct
2 Correct 382 ms 169656 KB Output is correct
3 Correct 394 ms 170680 KB Output is correct
4 Correct 380 ms 169144 KB Output is correct
5 Correct 325 ms 93924 KB Output is correct
6 Correct 402 ms 187624 KB Output is correct
7 Correct 370 ms 173404 KB Output is correct
8 Correct 385 ms 177796 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB Output is correct
2 Correct 296 ms 79364 KB Output is correct
3 Correct 1020 ms 263448 KB Output is correct
4 Correct 1008 ms 263352 KB Output is correct
5 Correct 1286 ms 258448 KB Output is correct
6 Correct 515 ms 120508 KB Output is correct
7 Correct 164 ms 61480 KB Output is correct
8 Correct 17 ms 18392 KB Output is correct
9 Correct 1131 ms 266044 KB Output is correct
10 Correct 1574 ms 247928 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 762 ms 253368 KB Output is correct
2 Correct 357 ms 205112 KB Output is correct
3 Correct 682 ms 180036 KB Output is correct
4 Correct 419 ms 210520 KB Output is correct
5 Correct 382 ms 207032 KB Output is correct
6 Correct 562 ms 171632 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 6492 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 6488 KB Output is correct
10 Correct 1 ms 6492 KB Output is correct
11 Correct 1 ms 6492 KB Output is correct
12 Correct 1 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 6488 KB Output is correct
16 Correct 1 ms 6748 KB Output is correct
17 Correct 1 ms 6748 KB Output is correct
18 Correct 2 ms 6748 KB Output is correct
19 Correct 5 ms 9052 KB Output is correct
20 Correct 5 ms 9204 KB Output is correct
21 Correct 5 ms 9052 KB Output is correct
22 Correct 7 ms 9816 KB Output is correct
23 Correct 10 ms 10844 KB Output is correct
24 Correct 6 ms 9820 KB Output is correct
25 Correct 5 ms 9568 KB Output is correct
26 Correct 6 ms 9820 KB Output is correct
27 Correct 8 ms 11608 KB Output is correct
28 Correct 9 ms 11612 KB Output is correct
29 Correct 9 ms 11612 KB Output is correct
30 Correct 15 ms 14116 KB Output is correct
31 Correct 11 ms 13148 KB Output is correct
32 Correct 11 ms 13092 KB Output is correct
33 Correct 103 ms 47440 KB Output is correct
34 Correct 105 ms 47296 KB Output is correct
35 Correct 110 ms 47552 KB Output is correct
36 Correct 170 ms 67172 KB Output is correct
37 Correct 173 ms 67776 KB Output is correct
38 Correct 194 ms 70692 KB Output is correct
39 Correct 113 ms 11620 KB Output is correct
40 Correct 111 ms 11720 KB Output is correct
41 Correct 108 ms 11716 KB Output is correct
42 Correct 115 ms 12336 KB Output is correct
43 Correct 110 ms 58860 KB Output is correct
44 Correct 113 ms 57880 KB Output is correct
45 Correct 110 ms 58704 KB Output is correct
46 Correct 110 ms 58568 KB Output is correct
47 Correct 105 ms 57348 KB Output is correct
48 Correct 116 ms 58560 KB Output is correct
49 Correct 105 ms 56772 KB Output is correct
50 Correct 108 ms 58000 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 6492 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 6488 KB Output is correct
10 Correct 1 ms 6492 KB Output is correct
11 Correct 1 ms 6492 KB Output is correct
12 Correct 1 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 6488 KB Output is correct
16 Correct 1 ms 6748 KB Output is correct
17 Correct 1 ms 6748 KB Output is correct
18 Correct 2 ms 6748 KB Output is correct
19 Correct 5 ms 9052 KB Output is correct
20 Correct 5 ms 9204 KB Output is correct
21 Correct 5 ms 9052 KB Output is correct
22 Correct 7 ms 9816 KB Output is correct
23 Correct 10 ms 10844 KB Output is correct
24 Correct 6 ms 9820 KB Output is correct
25 Correct 5 ms 9568 KB Output is correct
26 Correct 6 ms 9820 KB Output is correct
27 Correct 387 ms 168936 KB Output is correct
28 Correct 382 ms 169656 KB Output is correct
29 Correct 394 ms 170680 KB Output is correct
30 Correct 380 ms 169144 KB Output is correct
31 Correct 325 ms 93924 KB Output is correct
32 Correct 402 ms 187624 KB Output is correct
33 Correct 370 ms 173404 KB Output is correct
34 Correct 385 ms 177796 KB Output is correct
35 Correct 1 ms 6492 KB Output is correct
36 Correct 296 ms 79364 KB Output is correct
37 Correct 1020 ms 263448 KB Output is correct
38 Correct 1008 ms 263352 KB Output is correct
39 Correct 1286 ms 258448 KB Output is correct
40 Correct 515 ms 120508 KB Output is correct
41 Correct 164 ms 61480 KB Output is correct
42 Correct 17 ms 18392 KB Output is correct
43 Correct 1131 ms 266044 KB Output is correct
44 Correct 1574 ms 247928 KB Output is correct
45 Correct 762 ms 253368 KB Output is correct
46 Correct 357 ms 205112 KB Output is correct
47 Correct 682 ms 180036 KB Output is correct
48 Correct 419 ms 210520 KB Output is correct
49 Correct 382 ms 207032 KB Output is correct
50 Correct 562 ms 171632 KB Output is correct
51 Correct 8 ms 11608 KB Output is correct
52 Correct 9 ms 11612 KB Output is correct
53 Correct 9 ms 11612 KB Output is correct
54 Correct 15 ms 14116 KB Output is correct
55 Correct 11 ms 13148 KB Output is correct
56 Correct 11 ms 13092 KB Output is correct
57 Correct 103 ms 47440 KB Output is correct
58 Correct 105 ms 47296 KB Output is correct
59 Correct 110 ms 47552 KB Output is correct
60 Correct 170 ms 67172 KB Output is correct
61 Correct 173 ms 67776 KB Output is correct
62 Correct 194 ms 70692 KB Output is correct
63 Correct 113 ms 11620 KB Output is correct
64 Correct 111 ms 11720 KB Output is correct
65 Correct 108 ms 11716 KB Output is correct
66 Correct 115 ms 12336 KB Output is correct
67 Correct 110 ms 58860 KB Output is correct
68 Correct 113 ms 57880 KB Output is correct
69 Correct 110 ms 58704 KB Output is correct
70 Correct 110 ms 58568 KB Output is correct
71 Correct 105 ms 57348 KB Output is correct
72 Correct 116 ms 58560 KB Output is correct
73 Correct 105 ms 56772 KB Output is correct
74 Correct 108 ms 58000 KB Output is correct
75 Correct 398 ms 169656 KB Output is correct
76 Correct 404 ms 169544 KB Output is correct
77 Correct 358 ms 169140 KB Output is correct
78 Correct 374 ms 168824 KB Output is correct
79 Correct 442 ms 170164 KB Output is correct
80 Correct 382 ms 169196 KB Output is correct
81 Correct 938 ms 257620 KB Output is correct
82 Correct 786 ms 246968 KB Output is correct
83 Correct 791 ms 247388 KB Output is correct
84 Correct 1257 ms 277172 KB Output is correct
85 Correct 888 ms 254784 KB Output is correct
86 Correct 752 ms 243932 KB Output is correct
87 Correct 2740 ms 323276 KB Output is correct
88 Correct 418 ms 22784 KB Output is correct
89 Correct 363 ms 22712 KB Output is correct
90 Correct 385 ms 22476 KB Output is correct
91 Correct 378 ms 22204 KB Output is correct
92 Correct 403 ms 22480 KB Output is correct
93 Correct 405 ms 204388 KB Output is correct
94 Correct 2749 ms 91064 KB Output is correct
95 Correct 400 ms 206004 KB Output is correct
96 Correct 417 ms 205240 KB Output is correct
97 Correct 2047 ms 67176 KB Output is correct
98 Correct 433 ms 191860 KB Output is correct
99 Correct 412 ms 204748 KB Output is correct
100 Correct 373 ms 205912 KB Output is correct
101 Correct 550 ms 207624 KB Output is correct
102 Correct 421 ms 204236 KB Output is correct
103 Execution timed out 3022 ms 87636 KB Time limit exceeded
104 Halted 0 ms 0 KB -