Submission #985057

#TimeUsernameProblemLanguageResultExecution timeMemory
985057TsaganaCircle selection (APIO18_circle_selection)C++14
100 / 100
1907 ms55172 KiB
#include<bits/stdc++.h> #define IOS ios_base::sync_with_stdio(false);cin.tie();cout.tie(); #define all(x) x.begin(), x.end() #define int long long #define pi pair<int, int > #define pq priority_queue #define lb lower_bound #define ub upper_bound #define pb push_back #define eb emplace_back #define mset multiset #define F first #define S second using namespace std; struct circle { int x, y, r; void init() {cin >> x >> y >> r;} }; circle C[300001]; int n, mx, ans[300001]; map<pair<int, int>, vector<int>> mp; bool check(int i, int j) { int d = (C[i].x - C[j].x) * (C[i].x - C[j].x); d += (C[i].y - C[j].y) * (C[i].y - C[j].y); return (d <= (C[i].r + C[j].r) * (C[i].r + C[j].r)); } void build() {mp.clear(); for (int i = 1; i <= n; i++) if (!ans[i]) mp[{C[i].x/mx, C[i].y/mx}].pb(i); } bool cmp(int a, int b) {return (C[a].r > C[b].r || (C[a].r == C[b].r && a < b));} void solve() { cin >> n; for (int i = 1; i <= n; i++) {C[i].init(); C[i].x += 1e9; C[i].y += 1e9; mx = max(mx, C[i].r);} vector<int> v(n); iota(all(v), 1); sort(all(v), cmp); build(); for (int i: v) { if (ans[i]) continue; if (C[i].r <= mx / 2) {mx /= 2; build();} for (int j = C[i].x/mx-2; j <= C[i].x/mx+2; j++) for (int k = C[i].y/mx-2; k <= C[i].y/mx+2; k++) { if (!mp.count({j, k})) continue; for (int l: mp[{j, k}]) if (!ans[l] && check(i, l)) ans[l] = i; } } for (int i = 1; i <= n; i++) cout << ans[i] << ' '; } signed main() {IOS solve(); return 0;}
#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...