답안 #77738

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
77738 2018-09-30T06:44:42 Z autumn_eel 원 고르기 (APIO18_circle_selection) C++14
7 / 100
2727 ms 54948 KB
#include <bits/stdc++.h>
#define rep(i,n)for(int i=0;i<(n);i++)
#define INF 1e10
using namespace std;

int ans[400000];
struct Circle{
	float x,y,r;
	int id;
	float bbox[2][2];
	Circle(){}
	Circle(float x,float y,float r,int id):x(x),y(y),r(r),id(id){
		bbox[0][0]=x-r;bbox[0][1]=y-r;
		bbox[1][0]=x+r;bbox[1][1]=y+r;
	}
};
struct node{
	float bbox[2][2];
	node*l,*r;
	vector<Circle*>circle;
};
float area(float bbox[2][2]){
	return (bbox[1][0]-bbox[0][0])*(bbox[1][1]-bbox[0][1]);
}
void init(float bbox[2][2]){
	bbox[0][0]=bbox[0][1]=INF;
	bbox[1][0]=bbox[1][1]=-INF;
}
void mergeAABB(float bbox[2][2],float bbox2[2][2],float result[2][2]){
	rep(i,2){
		result[0][i]=min(bbox[0][i],bbox2[0][i]);
		result[1][i]=max(bbox[1][i],bbox2[1][i]);
	}
}
void createAABB(vector<Circle*>&circle,float result[2][2]){
	init(result);
	for(auto&c:circle){
		mergeAABB(result,c->bbox,result);
	}
}
node bvh[400000];
int pointer=0;

#define t_tri 1.
#define t_aabb 1.

void setleaf(vector<Circle*>circle,node*n){
	n->l=n->r=NULL;
	n->circle=circle;
}
void build(vector<Circle*>&circle,node*n){
	createAABB(circle,n->bbox);
	float Min=t_tri*circle.size();
	int axis=-1,id=-1;
	float s=area(n->bbox);
	rep(i,2){
		sort(circle.begin(),circle.end(),[&](auto a,auto b){
			if(i==0)return a->x<b->x;
			return a->y<b->y;
		});
		float box[2][2];init(box);
		vector<float>s1(circle.size());
		rep(j,circle.size()){
			mergeAABB(box,circle[j]->bbox,box);
			s1[j]=area(box);
		}
		init(box);
		vector<float>s2(circle.size());
		for(int j=circle.size()-1;j>=0;j--){
			mergeAABB(box,circle[j]->bbox,box);
			s2[j]=area(box);
		}
		for(int j=0;j+1<circle.size();j++){
			float cost=2*t_aabb+(s1[j]/s)*(j+1)*t_tri+(s2[j+1]/s)*(circle.size()-j-1)*t_tri;
			if(Min>cost){
				Min=cost;
				axis=i;id=j;
			}
		}
	}
	if(axis==-1){
		setleaf(circle,n);
	}
	else{
		sort(circle.begin(),circle.end(),[&](auto a,auto b){
			if(axis==0)return a->x<b->x;
			return a->y<b->y;
		});
		n->l=&bvh[pointer++];
		n->r=&bvh[pointer++];
		vector<Circle*>left(circle.begin(),circle.begin()+id+1);
		vector<Circle*>right(circle.begin()+id+1,circle.end());
		build(left,n->l);
		build(right,n->r);
	}
}
void dfs_bvh(node*n,int depth){
	if(depth==3){
		cout<<"(minx,miny),(maxx,maxy) = "<<"("<<n->bbox[0][0]<<","<<n->bbox[0][1]<<")"<<","<<"("<<n->bbox[1][0]<<","<<n->bbox[1][1]<<")"<<endl;
	}
	if(n->l)dfs_bvh(n->l,depth+1);
	if(n->r)dfs_bvh(n->r,depth+1);
}
bool intersect(float x,float y,float minx,float miny,float maxx,float maxy){
	return minx<=x&&x<=maxx&&miny<=y&&y<=maxy;
}
bool intersect(Circle*c1,Circle*c2){
	return pow(c1->x-(double)c2->x,2)+pow(c1->y-(double)c2->y,2)<=pow(c1->r+(double)c2->r,2);
}
bool intersect(Circle*c,float bbox[2][2]){
	if(intersect(c->x,c->y,bbox[0][0]-c->r,bbox[0][1],bbox[1][0]+c->r,bbox[1][1]))return true;
	if(intersect(c->x,c->y,bbox[0][0],bbox[0][1]-c->r,bbox[1][0],bbox[1][1]+c->r))return true;
	rep(i,2)rep(j,2){
		if(pow(bbox[i][0]-c->x,2)+pow(bbox[j][1]-c->y,2)<=pow(c->r,2))return true;
	}
	return false;
}
node*intersect(node*n,Circle*c){
	if(!intersect(c,n->bbox))return n;
	if(n->l){
		auto l=intersect(n->l,c);
		auto r=intersect(n->r,c);
		if(l==NULL&&r==NULL)return NULL;
		if(l==NULL)return r;
		if(r==NULL)return l;
		n->l=l;n->r=r;
		init(n->bbox);
		mergeAABB(l->bbox,r->bbox,n->bbox);
		return n;
	}
	else{
		auto&circle=n->circle;
		vector<Circle*>res;
		rep(i,circle.size()){
			if(intersect(circle[i],c)){
				ans[circle[i]->id]=c->id;
			}
			else{
				res.push_back(circle[i]);
			}
		}
		if(res.empty())return NULL;
		circle=res;
		createAABB(circle,n->bbox);
		return n;
	}
}

Circle c[400000];
int main(){
	int n;scanf("%d",&n);
	vector<Circle*>circle;
	rep(i,n){
		int x,y,r;scanf("%d%d%d",&x,&y,&r);
		c[i]=Circle(x/128.,y/128.,r/128.,i);
	}
	sort(c,c+n,[](auto a,auto b){
		if(a.r==b.r)return a.id<b.id;
		return a.r>b.r;
	});
	rep(i,n){
		circle.push_back(&c[i]);
	}
	node*root=&bvh[pointer++];
	build(circle,root);
	//~ dfs_bvh(root,0);
	memset(ans,-1,sizeof(ans));
	rep(i,n){
		if(ans[c[i].id]!=-1)continue;
		root=intersect(root,&c[i]);
		if(root==NULL)break;
	}
	rep(i,n){
		if(i)printf(" ");
		printf("%d",ans[i]+1);
	}
	puts("");
}

Compilation message

circle_selection.cpp: In function 'void build(std::vector<Circle*>&, node*)':
circle_selection.cpp:2:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define rep(i,n)for(int i=0;i<(n);i++)
                              ^
circle_selection.cpp:63:3: note: in expansion of macro 'rep'
   rep(j,circle.size()){
   ^~~
circle_selection.cpp:73:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j=0;j+1<circle.size();j++){
               ~~~^~~~~~~~~~~~~~
circle_selection.cpp: In function 'node* intersect(node*, Circle*)':
circle_selection.cpp:2:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define rep(i,n)for(int i=0;i<(n);i++)
                              ^
circle_selection.cpp:134:3: note: in expansion of macro 'rep'
   rep(i,circle.size()){
   ^~~
circle_selection.cpp: In function 'int main()':
circle_selection.cpp:151:13: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  int n;scanf("%d",&n);
        ~~~~~^~~~~~~~~
circle_selection.cpp:154:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   int x,y,r;scanf("%d%d%d",&x,&y,&r);
             ~~~~~^~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 23800 KB Output is correct
2 Correct 22 ms 23936 KB Output is correct
3 Correct 23 ms 24008 KB Output is correct
4 Correct 23 ms 24008 KB Output is correct
5 Correct 23 ms 24032 KB Output is correct
6 Correct 21 ms 24032 KB Output is correct
7 Correct 23 ms 24032 KB Output is correct
8 Correct 23 ms 24032 KB Output is correct
9 Correct 24 ms 24076 KB Output is correct
10 Correct 23 ms 24236 KB Output is correct
11 Correct 23 ms 24236 KB Output is correct
12 Correct 22 ms 24236 KB Output is correct
13 Correct 24 ms 24236 KB Output is correct
14 Correct 23 ms 24236 KB Output is correct
15 Correct 23 ms 24236 KB Output is correct
16 Correct 25 ms 24248 KB Output is correct
17 Correct 31 ms 24384 KB Output is correct
18 Correct 26 ms 24384 KB Output is correct
19 Correct 38 ms 24728 KB Output is correct
20 Correct 37 ms 24964 KB Output is correct
21 Correct 37 ms 25048 KB Output is correct
22 Correct 44 ms 25220 KB Output is correct
23 Correct 43 ms 25412 KB Output is correct
24 Correct 42 ms 25500 KB Output is correct
25 Correct 43 ms 25640 KB Output is correct
26 Correct 41 ms 25832 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1581 ms 51984 KB Output is correct
2 Correct 1596 ms 51984 KB Output is correct
3 Correct 1505 ms 51984 KB Output is correct
4 Correct 1577 ms 51984 KB Output is correct
5 Incorrect 1191 ms 51984 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 51984 KB Output is correct
2 Correct 673 ms 51984 KB Output is correct
3 Correct 2595 ms 54812 KB Output is correct
4 Correct 2727 ms 54812 KB Output is correct
5 Incorrect 2496 ms 54812 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2554 ms 54948 KB Output is correct
2 Correct 2542 ms 54948 KB Output is correct
3 Correct 2133 ms 54948 KB Output is correct
4 Correct 2533 ms 54948 KB Output is correct
5 Correct 2557 ms 54948 KB Output is correct
6 Incorrect 2041 ms 54948 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 23800 KB Output is correct
2 Correct 22 ms 23936 KB Output is correct
3 Correct 23 ms 24008 KB Output is correct
4 Correct 23 ms 24008 KB Output is correct
5 Correct 23 ms 24032 KB Output is correct
6 Correct 21 ms 24032 KB Output is correct
7 Correct 23 ms 24032 KB Output is correct
8 Correct 23 ms 24032 KB Output is correct
9 Correct 24 ms 24076 KB Output is correct
10 Correct 23 ms 24236 KB Output is correct
11 Correct 23 ms 24236 KB Output is correct
12 Correct 22 ms 24236 KB Output is correct
13 Correct 24 ms 24236 KB Output is correct
14 Correct 23 ms 24236 KB Output is correct
15 Correct 23 ms 24236 KB Output is correct
16 Correct 25 ms 24248 KB Output is correct
17 Correct 31 ms 24384 KB Output is correct
18 Correct 26 ms 24384 KB Output is correct
19 Correct 38 ms 24728 KB Output is correct
20 Correct 37 ms 24964 KB Output is correct
21 Correct 37 ms 25048 KB Output is correct
22 Correct 44 ms 25220 KB Output is correct
23 Correct 43 ms 25412 KB Output is correct
24 Correct 42 ms 25500 KB Output is correct
25 Correct 43 ms 25640 KB Output is correct
26 Correct 41 ms 25832 KB Output is correct
27 Correct 57 ms 54948 KB Output is correct
28 Correct 57 ms 54948 KB Output is correct
29 Correct 55 ms 54948 KB Output is correct
30 Correct 65 ms 54948 KB Output is correct
31 Correct 67 ms 54948 KB Output is correct
32 Correct 75 ms 54948 KB Output is correct
33 Correct 535 ms 54948 KB Output is correct
34 Correct 536 ms 54948 KB Output is correct
35 Correct 541 ms 54948 KB Output is correct
36 Correct 674 ms 54948 KB Output is correct
37 Correct 729 ms 54948 KB Output is correct
38 Correct 842 ms 54948 KB Output is correct
39 Correct 814 ms 54948 KB Output is correct
40 Correct 826 ms 54948 KB Output is correct
41 Correct 822 ms 54948 KB Output is correct
42 Correct 500 ms 54948 KB Output is correct
43 Incorrect 437 ms 54948 KB Output isn't correct
44 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 23800 KB Output is correct
2 Correct 22 ms 23936 KB Output is correct
3 Correct 23 ms 24008 KB Output is correct
4 Correct 23 ms 24008 KB Output is correct
5 Correct 23 ms 24032 KB Output is correct
6 Correct 21 ms 24032 KB Output is correct
7 Correct 23 ms 24032 KB Output is correct
8 Correct 23 ms 24032 KB Output is correct
9 Correct 24 ms 24076 KB Output is correct
10 Correct 23 ms 24236 KB Output is correct
11 Correct 23 ms 24236 KB Output is correct
12 Correct 22 ms 24236 KB Output is correct
13 Correct 24 ms 24236 KB Output is correct
14 Correct 23 ms 24236 KB Output is correct
15 Correct 23 ms 24236 KB Output is correct
16 Correct 25 ms 24248 KB Output is correct
17 Correct 31 ms 24384 KB Output is correct
18 Correct 26 ms 24384 KB Output is correct
19 Correct 38 ms 24728 KB Output is correct
20 Correct 37 ms 24964 KB Output is correct
21 Correct 37 ms 25048 KB Output is correct
22 Correct 44 ms 25220 KB Output is correct
23 Correct 43 ms 25412 KB Output is correct
24 Correct 42 ms 25500 KB Output is correct
25 Correct 43 ms 25640 KB Output is correct
26 Correct 41 ms 25832 KB Output is correct
27 Correct 1581 ms 51984 KB Output is correct
28 Correct 1596 ms 51984 KB Output is correct
29 Correct 1505 ms 51984 KB Output is correct
30 Correct 1577 ms 51984 KB Output is correct
31 Incorrect 1191 ms 51984 KB Output isn't correct
32 Halted 0 ms 0 KB -