Submission #407761

#TimeUsernameProblemLanguageResultExecution timeMemory
407761juggernautCircle selection (APIO18_circle_selection)C++17
19 / 100
3103 ms459476 KiB
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define fr first
#define sc second
struct Circle{
	int x,y,r,id;
	void read(int i){
		cin>>x>>y>>r;
		id=i;
	}
}a[300005];
bool operator<(Circle a,Circle b){
	return a.r>b.r||(a.r==b.r&&a.id<b.id);
}
typedef long long ll;
ll sq(ll x){return x*x;}
ll dist(int x,int y,int x2,int y2){return sq(x-x2)+sq(y-y2);}
bool intersect(Circle a,Circle b){
	return dist(a.x,a.y,b.x,b.y)<=sq(a.r+b.r);
}
int n;
int ans[300005];
void subtask1(){
	sort(a+1,a+1+n);
	for(int i=1;i<=n;i++)
		if(!ans[a[i].id])for(int j=1;j<=n;j++)if(!ans[a[j].id]&&intersect(a[i],a[j]))ans[a[j].id]=a[i].id;
	for(int i=1;i<=n;i++)printf("%d ",ans[i]);
	exit(0);
}
void subtask2(){
	set<pair<int,int>>st;
	for(int i=1;i<=n;i++){
		st.emplace(a[i].x-a[i].r,i);
		st.emplace(a[i].x+a[i].r,i);
	}
	sort(a+1,a+1+n);
	for(int i=1;i<=n;i++){
		if(ans[a[i].id])continue;
		while(true){
			auto it=st.lower_bound(make_pair(a[i].x-a[i].r,-2e9));
			if(it==st.end())break;
			if(it->first>a[i].x+a[i].r)break;
			st.erase(*it);
			if(ans[it->second])continue;
			ans[it->second]=a[i].id;
		}
	}
	for(int i=1;i<=n;i++)printf("%d ",ans[i]);
	exit(0);
}
void subtask4(){
	int r=a[1].r;
	unordered_map<int,unordered_map<int,vector<int>>>mp;
	for(int i=1;i<=n;i++)mp[a[i].x/r][a[i].y/r].push_back(i);
	for(int i=1;i<=n;i++){
		if(ans[i])continue;
		int x=a[i].x/r;
		int y=a[i].y/r;
		for(int i=x-2;i<=x+2;i++)
		for(int j=y-2;j<=y+2;j++){
			for(int to:mp[i][j])if(!ans[to])ans[to]=i;
		}
	}
	for(int i=1;i<=n;i++)printf("%d ",ans[i]);
	exit(0);
}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cin>>n;
	bool _subtask2=true;
	bool _subtask4=true;
	for(int i=1;i<=n;i++){
		a[i].read(i);
		_subtask2&=(a[i].y==0);
		_subtask4&=(a[i].r==a[1].r);
	}
	if(n<=5000)subtask1();
	else if(_subtask2)subtask2();
	else if(_subtask4)subtask4();
}
/*
11
9 9 2
13 2 1
11 8 2
3 3 2
3 12 1
12 14 1
9 8 5
2 8 2
5 2 1
14 4 2
14 14 1
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...