Submission #1160116

#TimeUsernameProblemLanguageResultExecution timeMemory
1160116xnqsCircle selection (APIO18_circle_selection)C++20
0 / 100
3096 ms31624 KiB
#include <iostream> #include <fstream> #include <vector> #include <queue> #include <utility> #include <algorithm> #include <cmath> #include <unordered_map> #include <unordered_set> #include <set> #include <map> struct Circle { int64_t x, y, r, idx; Circle(): x(0), y(0), r(0), idx(0) {} Circle(int64_t x, int64_t y, int64_t r, int64_t idx): x(x), y(y), r(r), idx(idx) {} bool operator == (const Circle& other) const { if (this->x!=other.x) return 0; if (this->y!=other.y) return 0; if (this->r!=other.r) return 0; if (this->idx!=other.idx) return 0; return 1; } }; struct CircleHasher { std::size_t operator() (const Circle& c) const { return (c.x>>5) ^ (c.y<<8) ^ (c.r>>13) ^ (c.idx<<21); } }; int64_t n; std::set<int> active; std::vector<Circle> circles; std::vector<int64_t> eliminator; int64_t grid_size; std::map<std::pair<int,int>, std::vector<int>> grid; inline int64_t euclid_dist(const Circle& a, const Circle& b) { return 1LL*(a.x-b.x)*(a.x-b.x) + 1LL*(a.y-b.y)*(a.y-b.y); } /* d(a,b) - a.r <= b.r sqrt((a.x-b.x)^2 + (a.y-b.y)^2) - a.r <= b.r sqrt((a.x-b.x)^2 + (a.y-b.y)^2) <= b.r + a.r (a.x-b.x)^2 + (a.y-b.y)^2 <= (b.r + a.r)^2 */ inline bool intersect(const Circle& a, const Circle& b) { return euclid_dist(a,b) <= 1LL*(a.r+b.r)*(a.r+b.r); } void init_grid(int64_t size) { grid.clear(); grid_size = size; for (auto i : active) { if (eliminator[circles[i].idx]) { continue; } grid[std::pair<int,int>(circles[i].x/size,circles[i].y/size)].emplace_back(i); } } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); std::cin >> n; for (int64_t i = 0, x, y, r; i < n; i++) { active.emplace(i); std::cin >> x >> y >> r; circles.emplace_back(x,y,r,i); } std::sort(circles.begin(),circles.end(),[](const Circle& a, const Circle& b) { return a.r > b.r; }); eliminator.assign(n, 0); init_grid(4LL*circles[0].r*circles[0].r); for (const auto& c : circles) { auto [x, y, r, idx] = c; if (4*r*r < grid_size/2) { init_grid(4*r*r); } if (eliminator[idx]) { active.erase(idx); continue; } eliminator[idx] = idx+1; active.erase(idx); //std::cout << idx << " " << grid_size << "\n"; int64_t grid_x = x / grid_size; int64_t grid_y = y / grid_size; for (int gx = grid_x-2; gx <= grid_x+2; gx++) { for (int gy = grid_y-2; gy <= grid_y+2; gy++) { for (int i = 0; i < grid[std::pair<int,int>(gx,gy)].size(); i++) { if (eliminator[circles[grid[std::pair<int,int>(gx,gy)][i]].idx]) { continue; } if (intersect(c, circles[grid[std::pair<int,int>(gx,gy)][i]])) { eliminator[circles[grid[std::pair<int,int>(gx,gy)][i]].idx] = idx+1; active.erase(circles[grid[std::pair<int,int>(gx,gy)][i]].idx); } } } } } for (int64_t i = 0; i < n; i++) { std::cout << eliminator[i] << " "; } std::cout << "\n"; }
#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...