제출 #1131200

#제출 시각아이디문제언어결과실행 시간메모리
1131200TraianDanciu원 고르기 (APIO18_circle_selection)C++20
7 / 100
2825 ms55232 KiB
#include <stdio.h>
#include <map>
#include <vector>
#include <algorithm>
#include <set>

const int MAXN = 300'000;
const int INFINIT = 2'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;
std::set<int> active;

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;
    active.insert(i);
  }
}

void sortCircles() {
  std::sort(circles, circles + n, [](Circle a, Circle b) {
    return a.r > b.r;
  });
}

void buildRegions(int new_size) {
  std::set<int>::iterator it;
  region_size = new_size;
  regions.clear();
  it = active.begin();
  while(it != active.end()) {
    regions[{circles[*it].x / region_size, circles[*it].y / region_size}].push_back(*it);
    it++;
  }
}

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;
  region_size = INFINIT;
  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 - 4; xregion_new <= xregion + 4; xregion_new++) {
        for(yregion_new = yregion - 4; yregion_new <= yregion + 4; 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;
                active.erase(neighbour);
              }
            }
          }
        }
      }
    }
  }
}

void writeAnswer() {
  int i;
  for(i = 0; i < n; i++) {
    printf("%d ", answer[i]);
  }
  fputc('\n', stdout);
}

int main() {
  readCircles();
  sortCircles();
  scanCircles();
  writeAnswer();
  return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

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