Submission #579112

#TimeUsernameProblemLanguageResultExecution timeMemory
579112noeditCircle selection (APIO18_circle_selection)C++17
72 / 100
3069 ms248424 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define MAX 301010 #define INF 1000000010 pair<pair<int, int>, pair<int, int>> in[MAX]; int X[MAX]; int Y[MAX]; int R[MAX]; int ind[MAX]; int ri[MAX]; int ans[MAX]; inline ll sq(ll x) { return x * x; } inline bool check(int i, int j) { return sq(X[i] - X[j]) + sq(Y[i] - Y[j]) <= sq(R[i] + R[j]); } bool isrange(int x, int y) { if (x < 0 || y < 0) { return false; } return true; } inline ll trans(int x, int y) { return ((ll)x * (ll)INF) + y; } bool cmp(pair<pair<int, int>, pair<int, int>>& p1, pair<pair<int, int>, pair<int, int>>& p2) { if (p1.first.first == p2.first.first) { return p1.first.second < p2.first.second; } else { return p1.first.first > p2.first.first; } } unordered_map<ll, vector<int>> mp; signed main() { ios::sync_with_stdio(false), cin.tie(0); int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> in[i].second.first >> in[i].second.second >> in[i].first.first, in[i].first.second = i; } sort(in + 1, in + n + 1, cmp); for (int i = 1; i <= n; i++) { tie(X[i], Y[i], R[i], ind[i]) = make_tuple(in[i].second.first + INF, in[i].second.second + INF, in[i].first.first, in[i].first.second); } int s, e; e = 0; for (int k = 30; k >= 0; k--) { int r = 1 << k; s = e + 1; if (R[s] < r / 2) { continue; } mp.clear(); e = 0; for (int i = s; i <= n; i++) { if (ans[i]) { continue; } int x = X[i] >> k; int y = Y[i] >> k; if (R[i] < r / 2 && !e) { e = i - 1; } for (int xx = x - 1; xx <= x + 1; xx++) { for (int yy = y - 1; yy <= y + 1; yy++) { mp[((ll)xx << 31LL) + yy].push_back(i); } } } if (e == 0) { e = n; } for (int i = s; i <= e; i++) { if (ans[i]) { continue; } ans[i] = i; int x, y; x = X[i] >> k; y = Y[i] >> k; for (int xx = x - 1; xx <= x + 1; xx++) { for (int yy = y - 1; yy <= y + 1; yy++) { ll t = ((ll)xx << 31LL) + yy; for (auto& c : mp[t]) { if (!ans[c] && check(c, i)) { ans[c] = i; } } } } } } for (int i = 1; i <= n; i++) { ri[ind[i]] = i; } for (int i = 1; i <= n; i++) { cout << ind[ans[ri[i]]] << ' '; } 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...