Submission #217780

#TimeUsernameProblemLanguageResultExecution timeMemory
217780VimmerCircle selection (APIO18_circle_selection)C++14
7 / 100
3090 ms66588 KiB
#include <bits/stdc++.h> #define F first #define S second #define sz(x) int(x.size()) #define pb push_back #define N 300005 #define M ll(998244353) using namespace std; typedef long double ld; typedef long long ll; typedef short int si; int ans[N]; set <pair <int, int> > se, sl, sr; bool cmp(pair <int, int> x, pair <int, int> y) { if (x.F != y.F) return x.F > y.F; return x.S < y.S; } int main() { ios_base::sync_with_stdio(0); istream::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; for (int i = 0; i < n; i++) ans[i] = -1; ld x[n], y[n], r[n]; bool f = 1; for (int i = 0; i < n; i++) {int X, Y, R; cin >> X >> Y >> R; if (Y != 0) f = 0; x[i] = X; y[i] = Y; r[i] = R;} if (f) { vector <pair <int, int> > vr; vr.clear(); for (int i = 0; i < n; i++) {vr.pb({r[i], i}); se.insert({x[i], i}); sl.insert({x[i] - r[i], i}); sr.insert({x[i] + r[i], i});} sort(vr.begin(), vr.end(), cmp); int j = 0; while (j < sz(vr)) { pair <int, int> pt = vr[j]; j++; if (ans[pt.S] != -1) continue; auto it = sl.upper_bound({x[pt.S] + r[pt.S], 1e9}); vector <int> del; del.clear(); if (it != sl.begin()) { it--; while (it != sl.begin()) { if ((*it).F < x[pt.S] - r[pt.S]) break; del.pb((*it).S); it--; } } auto itr = sr.lower_bound({x[pt.S] - r[pt.S], 1e9}); while (itr != sr.end()) { if ((*itr).F > x[pt.S] + r[pt.S]) break; del.pb((*itr).S); itr++; } auto itp = se.lower_bound({x[pt.S] - r[pt.S], 1e9}); while (itp != se.end()) { if ((*itp).F > x[pt.S] + r[pt.S]) break; del.pb((*itp).S); itp++; } for (auto it : del) { ans[it] = pt.S + 1; sl.erase({x[it] - r[it], it}); se.erase({x[it], it}); sr.erase({x[it] + r[it], it}); } } for (int i = 0; i < n; i++) cout << ans[i] << " "; exit(0); } int s = n; while (s > 0) { int nm = -1; for (int i = 0; i < n; i++) { if (ans[i] != -1) continue; if (nm == -1 || r[nm] < r[i]) nm = i; } for (int i = 0; i < n; i++) { if (ans[i] != -1) continue; ld rst = sqrt(pow(abs(x[nm] - x[i]), 2) + pow(abs(y[nm] - y[i]), 2)); if (r[nm] + r[i] >= rst) {ans[i] = nm + 1; s--;} } } for (int i = 0; i < n; i++) cout << ans[i] << " "; }
#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...