답안 #855763

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
855763 2023-10-01T18:14:30 Z dlalswp25 원 고르기 (APIO18_circle_selection) C++17
72 / 100
3000 ms 446296 KB
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>
 
using namespace std;
typedef pair<int, int> pii;
 
random_device rd;
mt19937 rng(rd());
 
const int INF = 1010101010;
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;
}
 
int gen() { return rng() & 7; }
 
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 SkipList {
	struct Node {
		pii v;
		Node *l, *r, *d;
 
		Node(pii _v) : v(_v), l(nullptr), r(nullptr), d(nullptr) {}
	};
 
	struct Layer {
		Node *head;
 
		Layer() {
			head = new Node({-INF, 0});
			head->r = new Node({INF, 0});
			head->r->l = head;
		}
	};
 
	int height;
	vector<Layer> V;
 
	SkipList() { V.push_back(Layer()); }
 
	Node *lower_bound(pii x) {
		Node *cur = V.back().head;
		int h = V.size();
		for (int i = h - 1; i >= 0; i--) {
			while (cur->r->v < x) cur = cur->r;
			if (i) cur = cur->d;
		}
		return cur->r;
	}
 
	void insert(pii x) {
		Node *cur = V.back().head;
		int h = V.size();
		vector<Node *> lst(h);
		for (int i = h - 1; i >= 0; i--) {
			while (cur->r->v < x) cur = cur->r;
			lst[i] = cur;
			if (i) cur = cur->d;
		}
		Node *bef = nullptr;
		for (int i = 0; ; i++) {
			if (i < h) {
				cur = lst[i];
			} else {
				V.push_back(Layer());
				cur = V.back().head;
				V[i].head->d = V[i - 1].head;
			}
			Node *tmp = cur->r;
			cur->r = new Node(x);
			cur->r->r = tmp;
			cur->r->l = cur;
			tmp->l = cur->r;
			cur->r->d = bef;
			bef = cur;
			if (gen()) break;
		}
	}
 
	void print() {
		for (int i = 0; i < V.size(); i++) {
			printf("level %d\n", i);
			Node *cur = V[i].head;
			while (cur) {
				printf("(%d %d; %d) ", cur->v.first, cur->v.second, !!cur->d);
				cur = cur->r;
			}
			puts("");
		}
	}
};
 
struct SegTree {
	struct Node {
		SkipList 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 r, int li) {
		int y = Y[cur];
		auto it = T[idx].s.lower_bound({y, 0});
		auto tmp = it;
		for (int i = 0; i < K; i++) {
			if (it->v.first == INF) break;
			if (XL[it->v.second] <= li) break;
			chk(it->v.second);
			if (it->v.first >= (long long)y + r + r) break;
			if (i < K - 1) it = it->r;
		}
		it = tmp;
		for (int i = 0; i < K; i++) {
			it = it->l;
			if (it->v.first == -INF) break;
			if (XL[it->v.second] <= li) break;
			chk(it->v.second);
			if (it->v.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 r, int li) {
		p += base; p--;
		while (p >= 1) {
			if (L[p] <= li) break;
			chk_node(p, 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], R[i], 0);
		seg.get(XR[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 member function 'void SkipList::print()':
circle_selection.cpp:109:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<SkipList::Layer>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  109 |   for (int i = 0; i < V.size(); i++) {
      |                   ~~^~~~~~~~~~
circle_selection.cpp: In function 'int main()':
circle_selection.cpp:212:2: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
  212 |  for (int i = 1; i <= N; i++) printf("%d ", ans[i]); puts("");
      |  ^~~
circle_selection.cpp:212:54: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  212 |  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 6492 KB Output is correct
3 Correct 1 ms 6592 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 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 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 6492 KB Output is correct
16 Correct 2 ms 7260 KB Output is correct
17 Correct 2 ms 7260 KB Output is correct
18 Correct 2 ms 7260 KB Output is correct
19 Correct 8 ms 11868 KB Output is correct
20 Correct 8 ms 11868 KB Output is correct
21 Correct 8 ms 11968 KB Output is correct
22 Correct 9 ms 12632 KB Output is correct
23 Correct 13 ms 13656 KB Output is correct
24 Correct 9 ms 12636 KB Output is correct
25 Correct 8 ms 12124 KB Output is correct
26 Correct 9 ms 12380 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 803 ms 349960 KB Output is correct
2 Correct 776 ms 349884 KB Output is correct
3 Correct 770 ms 350784 KB Output is correct
4 Correct 754 ms 349988 KB Output is correct
5 Correct 573 ms 183532 KB Output is correct
6 Correct 745 ms 365700 KB Output is correct
7 Correct 764 ms 355020 KB Output is correct
8 Correct 789 ms 357660 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB Output is correct
2 Correct 425 ms 124156 KB Output is correct
3 Correct 1550 ms 444484 KB Output is correct
4 Correct 1591 ms 442684 KB Output is correct
5 Correct 2177 ms 438340 KB Output is correct
6 Correct 731 ms 210364 KB Output is correct
7 Correct 253 ms 105764 KB Output is correct
8 Correct 34 ms 29392 KB Output is correct
9 Correct 1751 ms 446296 KB Output is correct
10 Execution timed out 3032 ms 427856 KB Time limit exceeded
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1146 ms 430588 KB Output is correct
2 Correct 650 ms 381880 KB Output is correct
3 Correct 1582 ms 360632 KB Output is correct
4 Correct 709 ms 385720 KB Output is correct
5 Correct 675 ms 383812 KB Output is correct
6 Correct 1153 ms 351416 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6488 KB Output is correct
2 Correct 1 ms 6492 KB Output is correct
3 Correct 1 ms 6592 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 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 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 6492 KB Output is correct
16 Correct 2 ms 7260 KB Output is correct
17 Correct 2 ms 7260 KB Output is correct
18 Correct 2 ms 7260 KB Output is correct
19 Correct 8 ms 11868 KB Output is correct
20 Correct 8 ms 11868 KB Output is correct
21 Correct 8 ms 11968 KB Output is correct
22 Correct 9 ms 12632 KB Output is correct
23 Correct 13 ms 13656 KB Output is correct
24 Correct 9 ms 12636 KB Output is correct
25 Correct 8 ms 12124 KB Output is correct
26 Correct 9 ms 12380 KB Output is correct
27 Correct 17 ms 17244 KB Output is correct
28 Correct 17 ms 17240 KB Output is correct
29 Correct 17 ms 17244 KB Output is correct
30 Correct 22 ms 19776 KB Output is correct
31 Correct 19 ms 18776 KB Output is correct
32 Correct 18 ms 18660 KB Output is correct
33 Correct 186 ms 92616 KB Output is correct
34 Correct 212 ms 92612 KB Output is correct
35 Correct 228 ms 92520 KB Output is correct
36 Correct 246 ms 110784 KB Output is correct
37 Correct 259 ms 111512 KB Output is correct
38 Correct 279 ms 114580 KB Output is correct
39 Correct 161 ms 12336 KB Output is correct
40 Correct 156 ms 12224 KB Output is correct
41 Correct 155 ms 12232 KB Output is correct
42 Correct 168 ms 12944 KB Output is correct
43 Correct 188 ms 102856 KB Output is correct
44 Correct 189 ms 101624 KB Output is correct
45 Correct 193 ms 102584 KB Output is correct
46 Correct 189 ms 102336 KB Output is correct
47 Correct 188 ms 101220 KB Output is correct
48 Correct 187 ms 102384 KB Output is correct
49 Correct 183 ms 100716 KB Output is correct
50 Correct 192 ms 101740 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6488 KB Output is correct
2 Correct 1 ms 6492 KB Output is correct
3 Correct 1 ms 6592 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 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 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 6492 KB Output is correct
16 Correct 2 ms 7260 KB Output is correct
17 Correct 2 ms 7260 KB Output is correct
18 Correct 2 ms 7260 KB Output is correct
19 Correct 8 ms 11868 KB Output is correct
20 Correct 8 ms 11868 KB Output is correct
21 Correct 8 ms 11968 KB Output is correct
22 Correct 9 ms 12632 KB Output is correct
23 Correct 13 ms 13656 KB Output is correct
24 Correct 9 ms 12636 KB Output is correct
25 Correct 8 ms 12124 KB Output is correct
26 Correct 9 ms 12380 KB Output is correct
27 Correct 803 ms 349960 KB Output is correct
28 Correct 776 ms 349884 KB Output is correct
29 Correct 770 ms 350784 KB Output is correct
30 Correct 754 ms 349988 KB Output is correct
31 Correct 573 ms 183532 KB Output is correct
32 Correct 745 ms 365700 KB Output is correct
33 Correct 764 ms 355020 KB Output is correct
34 Correct 789 ms 357660 KB Output is correct
35 Correct 1 ms 6492 KB Output is correct
36 Correct 425 ms 124156 KB Output is correct
37 Correct 1550 ms 444484 KB Output is correct
38 Correct 1591 ms 442684 KB Output is correct
39 Correct 2177 ms 438340 KB Output is correct
40 Correct 731 ms 210364 KB Output is correct
41 Correct 253 ms 105764 KB Output is correct
42 Correct 34 ms 29392 KB Output is correct
43 Correct 1751 ms 446296 KB Output is correct
44 Execution timed out 3032 ms 427856 KB Time limit exceeded
45 Halted 0 ms 0 KB -