Submission #204940

#TimeUsernameProblemLanguageResultExecution timeMemory
204940oolimryCircle selection (APIO18_circle_selection)C++14
49 / 100
3096 ms352516 KiB
#include <bits/stdc++.h> using namespace std; int n; struct Circle{ long long x, y, r, id; } sorted[300005], arr[300005];; inline bool intersect(Circle a, Circle b){ return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) <= (a.r + b.r) * (a.r + b.r); } inline long long ii(long long a, long long b){ return a * (1LL << 32LL) + b; } long long ans[300005]; struct custom_hash { static uint64_t splitmix64(uint64_t x) { // http://xorshift.di.unimi.it/splitmix64.c x += 0x9e3779b97f4a7c15; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9; x = (x ^ (x >> 27)) * 0x94d049bb133111eb; return x ^ (x >> 31); } size_t operator()(uint64_t x) const { static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); return splitmix64(x + FIXED_RANDOM); } }; unordered_map<long long, vector<int>, custom_hash> GRID; long long gridSize = 1LL << 61LL; inline void buildGrid(long long newGridSize){ gridSize = newGridSize; GRID.clear(); for(int i = 0;i < n;i++){ if(ans[i] == -1){ long long xSquare = arr[i].x / gridSize; long long ySquare = arr[i].y / gridSize; GRID[ii(xSquare,ySquare)].push_back(i); } } } bool comp(Circle a, Circle b){ if(a.r == b.r) return a.id < b.id; else return a.r > b.r; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin >> n; fill(ans, ans + n, -1); for(int i = 0;i < n;i++){ long long x, y, r; cin >> x >> y >> r; x += (1LL << 31LL); y += (1LL << 31LL); arr[i] = {x, y, r, i}; sorted[i] = {x, y, r, i}; } sort(sorted,sorted+n,comp); for(int i = 0;i < n;i++){ Circle C = sorted[i]; if(ans[C.id] != -1) continue; if(gridSize > 2 * C.r){ buildGrid(C.r); } long long xSquare = C.x / gridSize; long long ySquare = C.y / gridSize; for(long long x = xSquare - 2;x <= xSquare + 2;x++){ for(long long y = ySquare - 2;y <= ySquare + 2;y++){ vector<int> &points = GRID[ii(x,y)]; for(int p = 0;p < (int) points.size();p++){ if(intersect(arr[points[p]],C)){ ans[points[p]] = C.id; points[p] = points.back(); points.pop_back(); p--; } } } } } for(int i = 0;i < n;i++) cout << ans[i] + 1 << " "; }
#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...