Submission #204934

#TimeUsernameProblemLanguageResultExecution timeMemory
204934oolimryCircle selection (APIO18_circle_selection)C++14
12 / 100
1749 ms47456 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<long long, long long> ii; int n; struct Circle{ long long x, y, r, id; } arr[300005]; 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); } long long ans[300005]; bool used[300005]; struct pair_hash{ std::size_t operator () (ii const &pair) const{ return pair.first ^ pair.second; } }; map<ii, vector<int> > GRID; long long gridSize = 1LL << 61LL; void buildGrid(long long newGridSize){ gridSize = newGridSize; GRID.clear(); for(int i = 0;i < n;i++){ if(!used[i]){ 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 << 30LL); y += (1LL << 30LL); arr[i] = {x, y, r, i}; } sort(arr,arr+n,comp); for(int i = 0;i < n;i++){ Circle C = arr[i]; if(used[i]) continue; if(gridSize > 2LL * 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++){ if(GRID.find(ii(x,y)) == GRID.end()) continue; vector<int> &points = GRID[ii(x,y)]; for(int p = 0;p < (int) points.size();p++){ if(intersect(arr[points[p]], C)){ ans[arr[points[p]].id] = C.id; used[points[p]] = true; 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...