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...