제출 #217753

#제출 시각아이디문제언어결과실행 시간메모리
217753Vimmer원 고르기 (APIO18_circle_selection)C++14
7 / 100
3079 ms24564 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 psh[N * 4], t[N], ans[N], anser[N]; vector <pair <pair <int, int>, int> > gr; void build(int v, int tl, int tr) { if (tl > tr) return; if (tl == tr) t[v] = tl; else { int md = (tl + tr) >> 1; build(v + v, tl, md); build(v + v + 1, md + 1, tr); if (gr[t[v + v]].F.S > gr[t[v + v + 1]].F.S) t[v] = t[v + v]; else t[v] = t[v + v + 1]; } } void Push(int v, int tl, int tr) { if (psh[v] == 0) return; t[v] = -1; if (tl == tr) ans[tl] = psh[v]; else { if (psh[v + v] == 0) psh[v + v] = psh[v]; if (psh[v + v + 1] == 0) psh[v + v + 1] = psh[v]; } psh[v] = 0; } void upd(int v, int tl, int tr, int l, int r, int val) { if (tr < l || tr < l || tl > tr || psh[v] != 0) return; Push(v, tl, tr); if (l <= tl && tr <= r) {psh[v] = val; Push(v, tl, tr); return;} int md = (tl + tr) >> 1; upd(v + v, tl, md, l, r, val); upd(v + v + 1, md + 1, tr, l, r, val); if (t[v + v] == -1) t[v] = t[v + v + 1]; else if (t[v + v + 1] == -1) t[v] = t[v + v]; else { if (gr[t[v + v]].F.S > gr[t[v + v + 1]].F.S) t[v] = t[v + v]; else t[v] = t[v + v + 1]; } } void gt(int v, int tl, int tr, int pos) { Push(v, tl, tr); if (tl == tr) return; int md = (tl + tr) >> 1; if (pos <= md) gt(v + v, tl, md, pos); else gt(v + v + 1, md + 1, tr, pos); } 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++) {cin >> x[i] >> y[i] >> r[i]; if (y[i] != 0) f = 0;} if (f) { gr.resize(n); for (int i = 0; i < n; i++) {gr[i].F.F = x[i]; gr[i].F.S = r[i]; gr[i].S = i;} sort(gr.begin(), gr.end()); vector <int> vr; vr.resize(n); for (int i = 0; i < n; i++) vr[i] = gr[i].F.F; build(1, 0, n - 1); int v = t[1]; while (v != -1) { int l = lower_bound(vr.begin(), vr.end(), gr[v].F.F - gr[v].F.S) - vr.begin(); int r = upper_bound(vr.begin(), vr.end(), gr[v].F.F + gr[v].F.S) - vr.begin() - 1; upd(1, 0, n - 1, l, r, gr[v].S + 1); v = t[1]; } for (int i = 0; i < n; i++) gt(1, 0, n - 1, i); for (int i = 0; i < n; i++) anser[gr[i].S] = ans[i]; for (int i = 0; i < n; i++) cout << anser[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...