Submission #1131199

#TimeUsernameProblemLanguageResultExecution timeMemory
1131199TraianDanciuCircle selection (APIO18_circle_selection)C++20
7 / 100
3092 ms41148 KiB
#include <stdio.h> #include <map> #include <vector> #include <algorithm> const int MAXN = 300'000; const int MAXR = 1'000'000'000; int n, answer[MAXN], region_size; struct Circle { int x, y, r, idx; } circles[MAXN]; std::map<std::pair<int, int>, std::vector<int>> regions; void readCircles() { int i; scanf("%d", &n); for(i = 0; i < n; i++) { scanf("%d%d%d", &circles[i].x, &circles[i].y, &circles[i].r); circles[i].idx = i; } } void sortCircles() { std::sort(circles, circles + n, [](Circle a, Circle b) { return a.r > b.r; }); } void buildRegions(int new_size) { int i; region_size = new_size; regions.clear(); for(i = 0; i < n; i++) { regions[{circles[i].x / region_size, circles[i].y / region_size}].push_back(i); } } void initRegions() { buildRegions(2 * MAXR); } long long square(int x) { return 1LL * x * x; } int circlesTouch(int a, int b) { return square(circles[a].r + circles[b].r) >= square(circles[a].x - circles[b].x) + square(circles[a].y - circles[b].y); } void scanCircles() { int i, xregion_new, yregion_new, xregion, yregion, j, neighbour; for(i = 0; i < n; i++) { if(answer[circles[i].idx] == 0) { if(2 * circles[i].r <= region_size) { buildRegions(circles[i].r); } xregion = circles[i].x / region_size; yregion = circles[i].y / region_size; for(xregion_new = xregion - 2; xregion_new <= xregion + 2; xregion_new++) { for(yregion_new = yregion - 2; yregion_new <= yregion + 2; yregion_new++) { if(regions.count({xregion_new, yregion_new})) { for(j = 0; j < (int)regions[{xregion_new, yregion_new}].size(); j++) { neighbour = regions[{xregion_new, yregion_new}][j]; if(answer[circles[neighbour].idx] == 0 && circlesTouch(i, neighbour)) { answer[circles[neighbour].idx] = circles[i].idx + 1; } } } } } } } } void writeAnswer() { int i; for(i = 0; i < n; i++) { printf("%d ", answer[i]); } fputc('\n', stdout); } int main() { readCircles(); sortCircles(); initRegions(); scanCircles(); writeAnswer(); return 0; }

Compilation message (stderr)

circle_selection.cpp: In function 'void readCircles()':
circle_selection.cpp:19:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |   scanf("%d", &n);
      |   ~~~~~^~~~~~~~~~
circle_selection.cpp:21:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   21 |     scanf("%d%d%d", &circles[i].x, &circles[i].y, &circles[i].r);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...