제출 #1356117

#제출 시각아이디문제언어결과실행 시간메모리
1356117javkhlantogs원 고르기 (APIO18_circle_selection)C++20
0 / 100
684 ms56276 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll dist(ll x1,ll y1,ll x2,ll y2){
	return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
}
int main(){
	ll n,i,j,k,q;
	cin>>n;
	vector<vector<ll>> c(n,vector<ll>(4));
	vector<ll> ans(n+1),nearest(n+1);
	set<vector<ll>> st;
	for(i=0 ; i<n ; i++){
		cin>>c[i][0]>>c[i][1]>>c[i][2];
		c[i][3]=i;
	}
	if(n==1){
		cout<<1;
		return 0;
	}
	sort(c.begin(),c.end());
	for(i=0 ; i<n ; i++){
		st.insert({-c[i][2],i});
		ll d=4e18;
		for(j=i+1 ; j<n ; j++){
			ll dx=c[j][0]-c[i][0];
			if(dx*dx>=d) break;
			if(dist(c[j][0],c[j][1],c[i][0],c[i][1])<d){
				d=dist(c[j][0],c[j][1],c[i][0],c[i][1]);
				nearest[i]=j;
			}
		}
		for(j=i-1 ; j>=0 ; j--){
			ll dx=c[j][0]-c[i][0];
			if(dx*dx>=d) break;
			if(dist(c[j][0],c[j][1],c[i][0],c[i][1])<d){
				d=dist(c[j][0],c[j][1],c[i][0],c[i][1]);
				nearest[i]=j;
			}
		}
	}
	while(st.size()){
		vector<ll> x=*(st.begin());
		ll u=x[1],v=nearest[x[1]];
		ans[c[u][3]+1]=c[u][3]+1;
		st.erase(st.begin());
		if(dist(c[u][0],c[u][1],c[v][0],c[v][1])<=(c[u][2]+c[v][2])*(c[u][2]+c[v][2])){
			ans[c[v][3]+1]=c[u][3]+1;
			st.erase({-c[v][2],v});
		}
	}
	for(i=1 ; i<=n ; i++) cout<<ans[i]<<" ";
	return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…