답안 #304012

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
304012 2020-09-21T00:20:31 Z arnold518 원 고르기 (APIO18_circle_selection) C++14
37 / 100
3000 ms 901448 KB
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
 
const int MAXN = 6e5;
 
struct Circle
{
	ll x, y, r; int p;
};
 
int N;
Circle A[MAXN+10], B[MAXN+10];
vector<ll> xcomp, ycomp;
bool vis[MAXN+10];
 
int getycomp(int x) { return lower_bound(ycomp.begin(), ycomp.end(), x)-ycomp.begin()+1; }
 
struct Node
{
	ll x, y;
	int par;
	Node(int x, int y) : x(x), y(y), par(0) {}
	bool operator < (const Node &p) { return x<p.x; }
};

int Find(int x, vector<Node> &V)
{
	if(x>=V.size()) return x;
	if(V[x].par==x) return x;
	return V[x].par=Find(V[x].par, V);
}

struct SEG
{
	vector<Node> tree[MAXN*4+10];
	void push(int node, int tl, int tr, int pos, ll p, int q)
	{
		tree[node].push_back(Node(p, q));
		if(tl==tr) return;
		int mid=tl+tr>>1;
		if(pos<=mid) push(node*2, tl, mid, pos, p, q);
		else push(node*2+1, mid+1, tr, pos, p, q);
	}
	void init(int node, int tl, int tr)
	{
		sort(tree[node].begin(), tree[node].end());
		for(int i=0; i<tree[node].size(); i++) tree[node][i].par=i;
		if(tl==tr) return;
		int mid=tl+tr>>1;
		init(node*2, tl, mid);
		init(node*2+1, mid+1, tr);
	}
	void pop(int node, int tl, int tr, int l, int r, ll pl, ll pr, vector<int> &V)
	{
		if(r<tl || tr<l) return;
		if(l<=tl && tr<=r)
		{
			for(int i=Find(lower_bound(tree[node].begin(), tree[node].end(), Node(pl, 0))-tree[node].begin(), tree[node]); i<tree[node].size() && tree[node][i].x<=pr; i=Find(i+1, tree[node]))
			{
				if(vis[tree[node][i].y])
				{
					int t=Find(i+1, tree[node]);
					tree[node][i].par=t;
				}
				else
				{
					V.push_back(tree[node][i].y);
				}
			}
			return;
		}
		int mid=tl+tr>>1;
		pop(node*2, tl, mid, l, r, pl, pr, V);
		pop(node*2+1, mid+1, tr, l, r, pl, pr, V);
	}
}seg;
 
int ans[MAXN+10];
 
int main()
{
	scanf("%d", &N);
	for(int i=1; i<=N; i++) scanf("%lld%lld%lld", &A[i].x, &A[i].y, &A[i].r), A[i].p=i;
	for(int i=1; i<=N; i++) B[i]=A[i];
	sort(A+1, A+N+1, [&](const Circle &p, const Circle &q)
	{
		if(p.r!=q.r) return p.r>q.r;
		return p.p<q.p;
	});

	for(int i=1; i<=N; i++)
	{
		xcomp.push_back(A[i].x-A[i].r);
		xcomp.push_back(A[i].x+A[i].r);
		ycomp.push_back(A[i].y-A[i].r);
		ycomp.push_back(A[i].y+A[i].r);
	}
	
	sort(xcomp.begin(), xcomp.end());
	xcomp.erase(unique(xcomp.begin(), xcomp.end()), xcomp.end());
	
	sort(ycomp.begin(), ycomp.end());
	ycomp.erase(unique(ycomp.begin(), ycomp.end()), ycomp.end());
	
	for(int i=1; i<=N; i++)
	{
		int l=getycomp(A[i].y-A[i].r), r=getycomp(A[i].y+A[i].r);
		seg.push(1, 1, ycomp.size(), l, A[i].x-A[i].r, A[i].p);
		seg.push(1, 1, ycomp.size(), l, A[i].x+A[i].r, A[i].p);
		seg.push(1, 1, ycomp.size(), r, A[i].x-A[i].r, A[i].p);
		seg.push(1, 1, ycomp.size(), r, A[i].x+A[i].r, A[i].p);
	}
	seg.init(1, 1, ycomp.size());

	for(int i=1; i<=N; i++)
	{
		if(vis[A[i].p]) continue;
		ans[A[i].p]=A[i].p;
		vis[A[i].p]=1;
		vector<int> V;
		int l=getycomp(A[i].y-A[i].r), r=getycomp(A[i].y+A[i].r);
		seg.pop(1, 1, ycomp.size(), l, r, A[i].x-A[i].r, A[i].x+A[i].r, V);
		sort(V.begin(), V.end());
		V.erase(unique(V.begin(), V.end()), V.end());
		for(auto it : V)
		{
			if((A[i].x-B[it].x)*(A[i].x-B[it].x)+(A[i].y-B[it].y)*(A[i].y-B[it].y)>(A[i].r+B[it].r)*(A[i].r+B[it].r)) continue;
			ans[it]=A[i].p;
			vis[it]=1;
		}
	}
	for(int i=1; i<=N; i++) printf("%d ", ans[i]);
}

Compilation message

circle_selection.cpp: In function 'int Find(int, std::vector<Node>&)':
circle_selection.cpp:32:6: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Node>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |  if(x>=V.size()) return x;
      |     ~^~~~~~~~~~
circle_selection.cpp: In member function 'void SEG::push(int, int, int, int, ll, int)':
circle_selection.cpp:44:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   44 |   int mid=tl+tr>>1;
      |           ~~^~~
circle_selection.cpp: In member function 'void SEG::init(int, int, int)':
circle_selection.cpp:51:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Node>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   51 |   for(int i=0; i<tree[node].size(); i++) tree[node][i].par=i;
      |                ~^~~~~~~~~~~~~~~~~~
circle_selection.cpp:53:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   53 |   int mid=tl+tr>>1;
      |           ~~^~~
circle_selection.cpp: In member function 'void SEG::pop(int, int, int, int, int, ll, ll, std::vector<int>&)':
circle_selection.cpp:62:116: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Node>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |    for(int i=Find(lower_bound(tree[node].begin(), tree[node].end(), Node(pl, 0))-tree[node].begin(), tree[node]); i<tree[node].size() && tree[node][i].x<=pr; i=Find(i+1, tree[node]))
      |                                                                                                                   ~^~~~~~~~~~~~~~~~~~
circle_selection.cpp:76:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   76 |   int mid=tl+tr>>1;
      |           ~~^~~
circle_selection.cpp: In function 'int main()':
circle_selection.cpp:86:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   86 |  scanf("%d", &N);
      |  ~~~~~^~~~~~~~~~
circle_selection.cpp:87:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   87 |  for(int i=1; i<=N; i++) scanf("%lld%lld%lld", &A[i].x, &A[i].y, &A[i].r), A[i].p=i;
      |                          ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 56704 KB Output is correct
2 Correct 37 ms 56748 KB Output is correct
3 Correct 37 ms 56704 KB Output is correct
4 Correct 37 ms 56704 KB Output is correct
5 Correct 36 ms 56696 KB Output is correct
6 Correct 37 ms 56824 KB Output is correct
7 Correct 39 ms 56952 KB Output is correct
8 Correct 37 ms 56808 KB Output is correct
9 Correct 37 ms 56824 KB Output is correct
10 Correct 38 ms 56824 KB Output is correct
11 Correct 37 ms 56824 KB Output is correct
12 Correct 37 ms 56832 KB Output is correct
13 Correct 37 ms 56824 KB Output is correct
14 Correct 39 ms 56832 KB Output is correct
15 Correct 37 ms 56776 KB Output is correct
16 Correct 43 ms 57984 KB Output is correct
17 Correct 42 ms 58104 KB Output is correct
18 Correct 44 ms 57976 KB Output is correct
19 Correct 74 ms 66736 KB Output is correct
20 Correct 74 ms 66992 KB Output is correct
21 Correct 78 ms 66920 KB Output is correct
22 Correct 80 ms 66800 KB Output is correct
23 Correct 76 ms 66656 KB Output is correct
24 Correct 76 ms 66796 KB Output is correct
25 Correct 76 ms 66796 KB Output is correct
26 Correct 77 ms 66924 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3105 ms 849712 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 56696 KB Output is correct
2 Correct 1479 ms 282984 KB Output is correct
3 Execution timed out 3140 ms 901448 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3138 ms 894064 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 56704 KB Output is correct
2 Correct 37 ms 56748 KB Output is correct
3 Correct 37 ms 56704 KB Output is correct
4 Correct 37 ms 56704 KB Output is correct
5 Correct 36 ms 56696 KB Output is correct
6 Correct 37 ms 56824 KB Output is correct
7 Correct 39 ms 56952 KB Output is correct
8 Correct 37 ms 56808 KB Output is correct
9 Correct 37 ms 56824 KB Output is correct
10 Correct 38 ms 56824 KB Output is correct
11 Correct 37 ms 56824 KB Output is correct
12 Correct 37 ms 56832 KB Output is correct
13 Correct 37 ms 56824 KB Output is correct
14 Correct 39 ms 56832 KB Output is correct
15 Correct 37 ms 56776 KB Output is correct
16 Correct 43 ms 57984 KB Output is correct
17 Correct 42 ms 58104 KB Output is correct
18 Correct 44 ms 57976 KB Output is correct
19 Correct 74 ms 66736 KB Output is correct
20 Correct 74 ms 66992 KB Output is correct
21 Correct 78 ms 66920 KB Output is correct
22 Correct 80 ms 66800 KB Output is correct
23 Correct 76 ms 66656 KB Output is correct
24 Correct 76 ms 66796 KB Output is correct
25 Correct 76 ms 66796 KB Output is correct
26 Correct 77 ms 66924 KB Output is correct
27 Correct 133 ms 77920 KB Output is correct
28 Correct 128 ms 77992 KB Output is correct
29 Correct 130 ms 77992 KB Output is correct
30 Correct 130 ms 78044 KB Output is correct
31 Correct 135 ms 78176 KB Output is correct
32 Correct 131 ms 78044 KB Output is correct
33 Correct 1344 ms 282224 KB Output is correct
34 Correct 1326 ms 284292 KB Output is correct
35 Correct 1393 ms 283956 KB Output is correct
36 Correct 1412 ms 284496 KB Output is correct
37 Correct 1359 ms 284828 KB Output is correct
38 Correct 1442 ms 284744 KB Output is correct
39 Correct 623 ms 199080 KB Output is correct
40 Correct 642 ms 198952 KB Output is correct
41 Correct 635 ms 199204 KB Output is correct
42 Correct 681 ms 201256 KB Output is correct
43 Correct 1326 ms 284772 KB Output is correct
44 Correct 1307 ms 284596 KB Output is correct
45 Correct 1308 ms 284720 KB Output is correct
46 Correct 1314 ms 284392 KB Output is correct
47 Correct 1337 ms 284516 KB Output is correct
48 Correct 1347 ms 284688 KB Output is correct
49 Correct 1357 ms 285280 KB Output is correct
50 Correct 1577 ms 284736 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 56704 KB Output is correct
2 Correct 37 ms 56748 KB Output is correct
3 Correct 37 ms 56704 KB Output is correct
4 Correct 37 ms 56704 KB Output is correct
5 Correct 36 ms 56696 KB Output is correct
6 Correct 37 ms 56824 KB Output is correct
7 Correct 39 ms 56952 KB Output is correct
8 Correct 37 ms 56808 KB Output is correct
9 Correct 37 ms 56824 KB Output is correct
10 Correct 38 ms 56824 KB Output is correct
11 Correct 37 ms 56824 KB Output is correct
12 Correct 37 ms 56832 KB Output is correct
13 Correct 37 ms 56824 KB Output is correct
14 Correct 39 ms 56832 KB Output is correct
15 Correct 37 ms 56776 KB Output is correct
16 Correct 43 ms 57984 KB Output is correct
17 Correct 42 ms 58104 KB Output is correct
18 Correct 44 ms 57976 KB Output is correct
19 Correct 74 ms 66736 KB Output is correct
20 Correct 74 ms 66992 KB Output is correct
21 Correct 78 ms 66920 KB Output is correct
22 Correct 80 ms 66800 KB Output is correct
23 Correct 76 ms 66656 KB Output is correct
24 Correct 76 ms 66796 KB Output is correct
25 Correct 76 ms 66796 KB Output is correct
26 Correct 77 ms 66924 KB Output is correct
27 Execution timed out 3105 ms 849712 KB Time limit exceeded
28 Halted 0 ms 0 KB -