제출 #1170352

#제출 시각아이디문제언어결과실행 시간메모리
1170352mukundan314Square or Rectangle? (NOI19_squarerect)C++20
100 / 100
0 ms328 KiB
#include "squarerect.h"
#include <bits/stdc++.h>
using namespace std;

bool am_i_square(int N, int Q) {
  int used = 0;

  int min_fill = (N * N + 24) / 25;
  int min_side = std::ceil(std::sqrt(min_fill));

  int x = N, y = N;

  for (int i = min_side; i <= N; i += min_side) {
    for (int j = min_side; j < i; j += min_side) {
      if (used++, inside_shape(i, j)) {
        x = i, y = j;
        goto found;
      }

      if (used++, inside_shape(j, i)) {
        x = j, y = i;
        goto found;
      }
    }

    if (N < i + min_side)
      goto found;

    if (used++, inside_shape(i, i)) {
      x = i, y = i;
      goto found;
    }
  }

found:

  int lo, hi;

  lo = x - min_side + 1, hi = x;
  while (lo < hi) {
    int mi = lo + (hi - lo) / 2;
    if (used++, inside_shape(mi, y)) {
      hi = mi;
    } else {
      lo = mi + 1;
    }
  }

  x = lo;

  lo = y - min_side + 1, hi = y;
  while (lo < hi) {
    int mi = lo + (hi - lo) / 2;
    if (used++, inside_shape(x, mi)) {
      hi = mi;
    } else {
      lo = mi + 1;
    }
  }

  y = lo;

  if (N < x + min_side - 1 || N < y + min_side - 1)
    return false;

  lo = min_side - 1, hi = std::min(N - x, N - y) + 1;
  while (lo < hi) {
    int mi = lo + (hi - lo) / 2;
    if (used++, !inside_shape(x + mi, y + mi)) {
      hi = mi;
    } else {
      lo = mi + 1;
    }
  }

  int side = lo;

  bool valid = side != min_side - 1;
  if (valid && x + side - 1 <= N && y + side <= N)
    valid &= !inside_shape(x + side - 1, y + side);
  if (valid && x + side <= N && y + side - 1 <= N)
    valid &= !inside_shape(x + side, y + side - 1);
  return valid;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...