제출 #253168

#제출 시각아이디문제언어결과실행 시간메모리
253168Saboon원 고르기 (APIO18_circle_selection)C++14
87 / 100
3081 ms38992 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef complex<int> point;
const int maxn = 3e5 + 20;
const int inf = 1e9;

set<pair<int,int>> s[maxn];
int c[maxn], r[maxn];
point p[maxn];

ll SQ(int x){
	return 1ll*x*x;
}

ll dis(point x, point y){
	return SQ(x.real() - y.real()) + SQ(x.imag() - y.imag());
}

int main(){
	ios_base::sync_with_stdio(false);
	int n;
	cin >> n;
	vector<int> a;
	vector<pair<int,int>> larger;
	for (int i = 1; i <= n; i++){
		int x, y;
		cin >> x >> y >> r[i];
		p[i] = point(x,y);
		a.push_back(x);
		larger.push_back({r[i],-i});
	}
	sort(a.begin(), a.end());
	a.resize(unique(a.begin(),a.end())-a.begin());
	for (int i = 1; i <= n; i++){
		int x = p[i].real(), y = p[i].imag();
		x = lower_bound(a.begin(), a.end(), x) - a.begin();
		s[x].insert({y,i});
	}
	sort(larger.rbegin(), larger.rend());
	for (auto it : larger){
		int idx = -it.second;
		if (c[idx] != 0)
			continue;
		int x = p[idx].real(), y = p[idx].imag();
		int lef = lower_bound(a.begin(), a.end(), x-2ll*r[idx])-a.begin();
		int rig = upper_bound(a.begin(), a.end(), x+2ll*r[idx])-a.begin();
		for (int i = lef; i < rig; i++){
			vector<int> dels;
			for (auto j = s[i].lower_bound(make_pair(y-2ll*r[idx],0)); j != s[i].end(); j ++){
				int then = (*j).second;
				if (abs(p[then].imag()-p[idx].imag()) > 2ll*r[idx])
					break;
				if (dis(p[idx],p[then]) <= SQ(r[idx]+r[then])){
					c[then] = idx;
					dels.push_back(then);
				}
			}
			for (auto j : dels){
				int x = lower_bound(a.begin(), a.end(), p[j].real()) - a.begin();
				s[x].erase({p[j].imag(),j});
			}
		}
	}
	for (int i = 1; i <= n; i++)
		cout << c[i] << " \n"[i == n];
}
#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...