Submission #1070596

#TimeUsernameProblemLanguageResultExecution timeMemory
1070596thangdz2k7Circle selection (APIO18_circle_selection)C++17
100 / 100
1978 ms78792 KiB
#include <bits/stdc++.h> using namespace std; const int N = 3e5 + 5; long long sqr(long long x){ return x * x; } struct circle{ long long x, y, r; bool intersect(circle A){ return sqr(x - A.x) + sqr(y - A.y) <= sqr(r + A.r); } }; int n; circle a[N]; namespace subtask1{ int ans[N]; void solve(){ while (true){ long long maxr = 0; int idx = 0; for (int i = 1; i <= n; ++ i) if (!ans[i] && a[i].r > maxr){ idx = i; maxr = a[i].r; } if (!idx) break; for (int i = 1; i <= n; ++ i) if (!ans[i] && a[idx].intersect(a[i])) ans[i] = idx; } for (int i = 1; i <= n; ++ i) cout << ans[i] << ' '; } } vector <int> sr; namespace subtask2{ int ans[N]; set <pair <int, int>> l, r; void solve(){ for (int i = 1; i <= n; ++ i) { l.insert({a[i].x - a[i].r, i}); r.insert({a[i].x + a[i].r, i}); } for (int id : sr){ if (ans[id]) continue; int le = a[id].x - a[id].r; int ri = a[id].x + a[id].r; auto it = l.lower_bound({le, 0}); while (it != l.end() && it -> first <= ri){ int del = it -> second; ans[del] = id; ++ it; l.erase({a[del].x - a[del].r, del}); r.erase({a[del].x + a[del].r, del}); } it = r.lower_bound({le, 0}); while (it != r.end() && it -> first <= ri){ int del = it -> second; ans[del] = id; ++ it; l.erase({a[del].x - a[del].r, del}); r.erase({a[del].x + a[del].r, del}); } } for (int i = 1; i <= n; ++ i) cout << ans[i] << ' '; } } namespace subtask4{ using pii = pair <int, int>; map <pii, set <int>> grid; int ans[N]; void solve(){ int radius = a[1].r; for (int i = 1; i <= n; ++ i){ int x = a[i].x / radius; int y = a[i].y / radius; grid[{x, y}].insert(i); } for (int id : sr){ if (ans[id]) continue; int x = a[id].x / radius; int y = a[id].y / radius; for (int i = x - 2; i <= x + 2; ++ i){ for (int j = y - 2; j <= y + 2; ++ j){ auto it1 = grid.find({i, j}); if (it1 == grid.end()) continue; for (auto it = (it1 -> second).begin(); it != (it1 -> second).end();){ if (a[id].intersect(a[*it])){ ans[*it] = id; it = (it1 -> second).erase(it); } else ++ it; } } } } for (int i = 1; i <= n; ++ i) cout << ans[i] << ' '; } } namespace Accepted{ using pii = pair <int, int>; int block = 0, ans[N]; set <int> remain; map <pii, set <int>> grid; void recalc(){ grid.clear(); for (int id : remain) { int x = a[id].x / block; int y = a[id].y / block; grid[{x, y}].insert(id); } } void solve(){ for (int i = 1; i <= n; ++ i) remain.insert(i); for (int id : sr){ if (ans[id]) continue; if (block == 0 || a[id].r * 2 <= block){ block = a[id].r; recalc(); } int x = a[id].x / block; int y = a[id].y / block; for (int i = x - 2; i <= x + 2; ++ i){ for (int j = y - 2; j <= y + 2; ++ j){ auto it1 = grid.find({i, j}); if (it1 == grid.end()) continue; for (auto it = (it1 -> second).begin(); it != (it1 -> second).end();){ if (a[id].intersect(a[*it])){ ans[*it] = id; remain.erase(*it); it = (it1 -> second).erase(it); } else ++ it; } } } } for (int i = 1; i <= n; ++ i) cout << ans[i] << ' '; } } void solve(){ cin >> n; bool ck2 = true; bool ck4 = true; for (int i = 1; i <= n; ++ i) { sr.push_back(i); cin >> a[i].x >> a[i].y >> a[i].r; if (a[i].y != 0) ck2 = false; if (i > 1 && a[i].r != a[i - 1].r) ck4 = false; } sort(sr.begin(), sr.end(), [&](int u, int v){ if (a[u].r == a[v].r) return u < v; return a[u].r > a[v].r; }); if (n <= 5000) subtask1::solve(); else if (ck2) subtask2::solve(); else if (ck4) subtask4::solve(); else Accepted::solve(); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); 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...