Submission #49612

# Submission time Handle Problem Language Result Execution time Memory
49612 2018-06-01T03:20:38 Z Diuven Circle selection (APIO18_circle_selection) C++11
49 / 100
3000 ms 95380 KB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
const int MX=300010, inf=2e9;

struct CIRCLE {
	int x, y, r, idx, kill;
} C[MX];

ll sq(ll x){ return x*x; }
ll dist(int a, int b){
	return sq(C[a].x-C[b].x)+sq(C[a].y-C[b].y);
}
bool hit(int a, int b){
	return dist(a,b)<=sq(C[a].r+C[b].r);
}

int n;

void input(){
	cin>>n;
	for(int i=1; i<=n; i++){
		int x, y, r;
		cin>>x>>y>>r;
		C[i]={x,y,r,i,0};
	}
}

vector<vector<vi>> G;
ll t=1<<30;
// [-t, 0), [0, t)

inline int sect(int idx, int x0, int y0){
	// 1 3
	// 0 2
	int x=C[idx].x, y=C[idx].y;
	if(x<x0)
		if(y<y0) return 0;
		else return 1;
	else
		if(y<y0) return 2;
		else return 3;
}

inline int range(ll x){
	if(x>0) return x/t;
	return -((-x+t-1)/t);
}
int xrange(const vi &cell){
	return range(C[cell.front()].x);
}
int yrange(const vi &cell){
	return range(C[cell.front()].y);
}
int xrange(const vector<vi> &X){
	return xrange(X.front());
}


void init_grid(){
	vi V[4];
	for(int i=1; i<=n; i++){
		V[sect(i,0,0)].push_back(i);
	}
	vector<vi> X[2];
	for(int k=0; k<4; k++)
		if(!V[k].empty())
			X[k/2].push_back(V[k]);

	if(!X[0].empty()) G.push_back(X[0]);
	if(!X[1].empty()) G.push_back(X[1]);
}

void resize_grid(){
	vector<vector<vi>> tmp;
	for(auto &X:G){
		vector<vi> newX[2];
		for(vi &cell:X){
			vi V[4];
			int x=xrange(cell)*t + t/2;
			int y=yrange(cell)*t + t/2;
			for(int idx:cell)
				V[sect(idx,x,y)].push_back(idx);
			for(int k=0; k<4; k++)
				if(!V[k].empty())
					newX[k/2].push_back(V[k]);
		}
		if(!newX[0].empty()) tmp.push_back(newX[0]);
		if(!newX[1].empty()) tmp.push_back(newX[1]);
	}
	G=tmp;
	t/=2;
}
void process(const vi &cell, int killer){
	// cell을 업데이트 안해도 되나?
	for(int killed:cell)
		if(C[killed].kill==0 && hit(killed, killer))
			C[killed].kill=killer;
}

void kill(int idx){
	while(C[idx].r*2<t){
		resize_grid();
	}
	int x=C[idx].x, y=C[idx].y;
	ll lx=range(x)-2, hx=range(x)+3;
	ll ly=range(y)-2, hy=range(y)+3;
	
	int n1=G.size();
	int s1=0, e1=n1-1;
	while(s1<e1){
		int m1=(s1+e1)/2;
		if(xrange(G[m1])<lx) s1=m1+1;
		else e1=m1;
	}
	int pos=s1;
	while(pos<min(n1,s1+5) && lx<=xrange(G[pos]) && xrange(G[pos])<=hx){
		vector<vi> &X=G[pos];
		int n2=X.size();
		int s2=0, e2=n2-1;
		while(s2<e2){
			int m2=(s2+e2)/2;
			if(yrange(X[m2])<ly) s2=m2+1;
			else e2=m2;
		}
		while(s2<n2 && ly<=yrange(X[s2]) && yrange(X[s2])<=hy){
			process(X[s2], idx);
			s2++;
		}
		pos++;
	}
}

void solve(){
	CIRCLE D[MX];
	for(int i=1; i<=n; i++) D[i]=C[i];
	sort(D+1, D+n+1, [](CIRCLE &a, CIRCLE &b){
		if(a.r==b.r) return a.idx<b.idx;
		return a.r>b.r;
	});
	for(int i=1; i<=n; i++){
		int idx=D[i].idx;
		if(C[idx].kill!=0) continue;
		kill(idx);
	}
}

int main(){
	ios::sync_with_stdio(0); cin.tie(0);
	input();
	init_grid();
	solve();
	
	for(int i=1; i<=n; i++) cout<<C[i].kill<<' ';
	return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 416 KB Output is correct
4 Correct 2 ms 416 KB Output is correct
5 Correct 2 ms 496 KB Output is correct
6 Correct 3 ms 620 KB Output is correct
7 Correct 3 ms 620 KB Output is correct
8 Correct 2 ms 620 KB Output is correct
9 Correct 2 ms 620 KB Output is correct
10 Correct 2 ms 620 KB Output is correct
11 Correct 3 ms 620 KB Output is correct
12 Correct 3 ms 620 KB Output is correct
13 Correct 3 ms 620 KB Output is correct
14 Correct 4 ms 620 KB Output is correct
15 Correct 3 ms 620 KB Output is correct
16 Correct 4 ms 892 KB Output is correct
17 Correct 3 ms 892 KB Output is correct
18 Correct 3 ms 892 KB Output is correct
19 Correct 8 ms 932 KB Output is correct
20 Correct 8 ms 932 KB Output is correct
21 Correct 10 ms 1292 KB Output is correct
22 Correct 67 ms 2204 KB Output is correct
23 Correct 68 ms 2232 KB Output is correct
24 Correct 54 ms 2232 KB Output is correct
25 Correct 61 ms 2232 KB Output is correct
26 Correct 57 ms 2272 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 208 ms 18272 KB Output is correct
2 Correct 257 ms 18272 KB Output is correct
3 Correct 210 ms 18272 KB Output is correct
4 Correct 201 ms 18272 KB Output is correct
5 Correct 747 ms 44564 KB Output is correct
6 Correct 2309 ms 95380 KB Output is correct
7 Correct 1243 ms 95380 KB Output is correct
8 Correct 1532 ms 95380 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 95380 KB Output is correct
2 Correct 2037 ms 95380 KB Output is correct
3 Execution timed out 3063 ms 95380 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 3067 ms 95380 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 416 KB Output is correct
4 Correct 2 ms 416 KB Output is correct
5 Correct 2 ms 496 KB Output is correct
6 Correct 3 ms 620 KB Output is correct
7 Correct 3 ms 620 KB Output is correct
8 Correct 2 ms 620 KB Output is correct
9 Correct 2 ms 620 KB Output is correct
10 Correct 2 ms 620 KB Output is correct
11 Correct 3 ms 620 KB Output is correct
12 Correct 3 ms 620 KB Output is correct
13 Correct 3 ms 620 KB Output is correct
14 Correct 4 ms 620 KB Output is correct
15 Correct 3 ms 620 KB Output is correct
16 Correct 4 ms 892 KB Output is correct
17 Correct 3 ms 892 KB Output is correct
18 Correct 3 ms 892 KB Output is correct
19 Correct 8 ms 932 KB Output is correct
20 Correct 8 ms 932 KB Output is correct
21 Correct 10 ms 1292 KB Output is correct
22 Correct 67 ms 2204 KB Output is correct
23 Correct 68 ms 2232 KB Output is correct
24 Correct 54 ms 2232 KB Output is correct
25 Correct 61 ms 2232 KB Output is correct
26 Correct 57 ms 2272 KB Output is correct
27 Correct 21 ms 95380 KB Output is correct
28 Correct 11 ms 95380 KB Output is correct
29 Correct 15 ms 95380 KB Output is correct
30 Correct 132 ms 95380 KB Output is correct
31 Correct 189 ms 95380 KB Output is correct
32 Correct 143 ms 95380 KB Output is correct
33 Correct 113 ms 95380 KB Output is correct
34 Correct 107 ms 95380 KB Output is correct
35 Correct 573 ms 95380 KB Output is correct
36 Correct 2077 ms 95380 KB Output is correct
37 Correct 1873 ms 95380 KB Output is correct
38 Correct 1853 ms 95380 KB Output is correct
39 Correct 600 ms 95380 KB Output is correct
40 Correct 432 ms 95380 KB Output is correct
41 Correct 376 ms 95380 KB Output is correct
42 Correct 267 ms 95380 KB Output is correct
43 Correct 686 ms 95380 KB Output is correct
44 Correct 851 ms 95380 KB Output is correct
45 Correct 546 ms 95380 KB Output is correct
46 Correct 558 ms 95380 KB Output is correct
47 Correct 619 ms 95380 KB Output is correct
48 Correct 738 ms 95380 KB Output is correct
49 Correct 725 ms 95380 KB Output is correct
50 Correct 779 ms 95380 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 416 KB Output is correct
4 Correct 2 ms 416 KB Output is correct
5 Correct 2 ms 496 KB Output is correct
6 Correct 3 ms 620 KB Output is correct
7 Correct 3 ms 620 KB Output is correct
8 Correct 2 ms 620 KB Output is correct
9 Correct 2 ms 620 KB Output is correct
10 Correct 2 ms 620 KB Output is correct
11 Correct 3 ms 620 KB Output is correct
12 Correct 3 ms 620 KB Output is correct
13 Correct 3 ms 620 KB Output is correct
14 Correct 4 ms 620 KB Output is correct
15 Correct 3 ms 620 KB Output is correct
16 Correct 4 ms 892 KB Output is correct
17 Correct 3 ms 892 KB Output is correct
18 Correct 3 ms 892 KB Output is correct
19 Correct 8 ms 932 KB Output is correct
20 Correct 8 ms 932 KB Output is correct
21 Correct 10 ms 1292 KB Output is correct
22 Correct 67 ms 2204 KB Output is correct
23 Correct 68 ms 2232 KB Output is correct
24 Correct 54 ms 2232 KB Output is correct
25 Correct 61 ms 2232 KB Output is correct
26 Correct 57 ms 2272 KB Output is correct
27 Correct 208 ms 18272 KB Output is correct
28 Correct 257 ms 18272 KB Output is correct
29 Correct 210 ms 18272 KB Output is correct
30 Correct 201 ms 18272 KB Output is correct
31 Correct 747 ms 44564 KB Output is correct
32 Correct 2309 ms 95380 KB Output is correct
33 Correct 1243 ms 95380 KB Output is correct
34 Correct 1532 ms 95380 KB Output is correct
35 Correct 3 ms 95380 KB Output is correct
36 Correct 2037 ms 95380 KB Output is correct
37 Execution timed out 3063 ms 95380 KB Time limit exceeded
38 Halted 0 ms 0 KB -