DOJ logoDOJ
문제
최근 추가된 문제들저장한 문제문제집
카테고리DLC대회그룹팀게시판
랭킹
문제 풀이 랭킹스트릭 랭킹DOJ Power 랭킹
현황
문제 제안로그인회원가입
DOJ logoDOJ

OI 서브태스크 채점, Elo 레이팅, Discord 인증을 갖춘 커뮤니티 온라인 저지.

문제
문제 목록카테고리
커뮤니티
대회랭킹게시판공지사항외부 대회 개최이용 안내
계정
로그인회원가입채점 현황
정책
이용약관DLC 이용 규칙개인정보 처리방침API 사용 설명서언어별 채점 환경대회 순위 보상레이팅과 퍼포먼스
© 2026 DOJ
모든 권리 보유
해설

다다스퀘어

문제로 돌아가기

해설

한 변의 길이 LLL로 점들을 덮을 수 있는지를 먼저 판정하고, LLL을 이분 탐색한다. 점의 좌표가 모두 정수이므로 최적의 LLL도 정수로 선택할 수 있다. 답은 000 이상 2⋅1092\cdot 10^92⋅109 이하이다.

다음에서 점들의 바운딩 박스를 [xmin⁡,xmax⁡]×[ymin⁡,ymax⁡][x_{\min},x_{\max}]\times[y_{\min},y_{\max}][xmin​,xmax​]×[y라고 하자. 각 정사각형은 이 바운딩 박스 바깥으로 나간 부분을 안쪽으로 밀어서, 해당 변과 맞닿게 놓을 수 있다.

1. 모서리에 정사각형이 있는 경우

점들을 정사각형 두 개로 덮을 수 있다면, 바운딩 박스의 서로 마주 보는 두 모서리에 각각 정사각형을 놓는 해가 존재한다. 두 대각선 방향을 점검하면 되므로 두 개로 덮을 수 있는지는 O(N)O(N)O(N)에 판정한다.

세 개로 덮을 수 있다면, 바운딩 박스의 어떤 모서리에 정사각형 하나를 놓는 해가 존재한다. 모든 점의 상하좌우 극값을 세 개의 정사각형이 덮으므로 어떤 정사각형은 두 방향의 극값을 동시에 덮는다. 두 방향이 인접하면 해당 모서리로 밀 수 있고, 마주 보는 방향이면 바운딩 박스의 그 방향 길이가 LLL 이하이므로 다시 모서리로 밀 수 있다. 네 모서리 중 하나를 골라 그 정사각형에 덮이지 않은 점들을 위의 두 정사각형 판정으로 확인한다. 이것도 O(N)O(N)O(N)이다.

마찬가지로 네 개 중 어떤 정사각형이 두 방향의 극값을 덮는 경우, 네 모서리에 하나씩 놓아 보고 남은 점을 세 개로 덮을 수 있는지 확인한다. 총 O(N)O(N)O(N)이다.

2. 네 정사각형이 서로 다른 변에 닿는 경우

남은 경우에는 네 정사각형이 각각 왼쪽, 오른쪽, 위쪽, 아래쪽 변에 닿는다. 이들을 SL,SR,ST,SBS_L,S_R,S_T,S_BSL​,SR​,ST​,라고 하자. 의 왼쪽 변은 에, 의 오른쪽 변은 에, 의 위쪽 변은 에, 의 아래쪽 변은 에 맞춘다.

상하를 뒤집는 두 방향을 검사하면, STS_TST​가 SBS_BSB​보다 왼쪽에 놓이는 경우만 고려해도 된다.

SLS_LSL​의 윗변의 높이를 ttt라고 두고 고정하자. SLS_LSL​에 덮이지 않은 점들을 P′P'라고 한다. 이때 는 의 가장 왼쪽 점의 좌표를 왼쪽 변으로 하고, 윗변은 에 맞출 수 있다. 그렇지 않으면 다른 정사각형들도 그 가장 왼쪽 점을 덮을 수 없거나, 를 왼쪽으로 밀어도 기존 점들을 잃지 않는다.

이제 STS_TST​에도 덮이지 않은 점들의 최소 xxx좌표에 SBS_BSB​의 왼쪽 변을 놓고, 아랫변을 ymin⁡y_{\min}에 맞춘다. 나머지 점들의 바운딩 박스의 가로·세로 길이가 모두 이하인지 확인하면 마지막 하나로 덮을 수 있는지 판정된다.

3. 스위핑을 O(Nlog⁡N)O(N\log N)O(NlogN)에 구현하기

SLS_LSL​에 포함될 수 있는 점은 xi≤xmin⁡+Lx_i\le x_{\min}+Lxi​≤x인 점뿐이다. 해당 점은 일 때 에 들어간다. 따라서 가 변하면서 점의 포함 여부가 변하는 사건은 점마다 최대 두 개다.

한편 STS_TST​와 SBS_BSB​가 덮는 세로 구간은 고정되어 있다. 점들을 다음 네 분류 중 하나에 넣는다.

  • 위쪽 구간: yi≥ymax⁡−Ly_i\ge y_{\max}-Lyi​≥ymax​−L.
  • 아래쪽 구간: yi≤ymin⁡+Ly_i\le y_{\min}+L.

점들을 xxx좌표로 정렬하고 세그먼트 트리를 구성한다. 각 노드는 현재 SLS_LSL​에 덮이지 않은 점들에 대해 네 분류별 바운딩 박스를 유지한다. 점 하나의 포함 상태 변경은 O(log⁡N)O(\log N)O(logN)에 처리된다. 또한 임의의 xxx 구간과 분류의 합집합에 대한 바운딩 박스를 에 얻는다.

STS_TST​의 왼쪽 변을 aaa라고 하면 aaa는 현재 남은 점들의 최소 xxx좌표이다. STS_TS는 에 있는 위쪽 구간의 점을 덮는다. 이를 제외한 점들의 최소 좌표를 라 하면 의 왼쪽 변이 이다. 는 세그먼트 트리의 전체 또는 구간 질의로 계산한다.

두 정사각형을 더 제거한 뒤의 점들은 x≥bx\ge bx≥b에만 남는다. 남은 점들의 바운딩 박스는 아래 구간들의 합집합으로 구한다.

  • b≤x≤a+Lb\le x\le a+Lb≤x≤a+L: 위쪽과 아래쪽 구간 모두에 속하지 않는 점.
  • max⁡(b,a+L+1)≤x≤b+L\max(b,a+L+1)\le x\le b+Lmax(b,a+L+: 아래쪽 구간에 속하지 않는 점.

입력 좌표가 정수이므로 열린 구간의 경계는 위와 같이 정수로 표시할 수 있다. 각 사건 높이에서 새로 들어온 점을 제거한 직후와, 구간에서 빠져나온 점을 되돌린 직후의 상태를 검사한다. 이를 통해 모든 서로 다른 포함 상태를 확인한다.

세그먼트 트리 구성에 O(N)O(N)O(N), 사건 정렬에 O(Nlog⁡N)O(N\log N)O(NlogN), 최대 2N2N2N번의 상태 변경과 질의에 O(Nlog⁡N)O(N\log N)O(N이 걸린다. 상하 방향을 뒤집는 경우도 같은 복잡도이다.

따라서 한 번의 판정은 O(Nlog⁡N)O(N\log N)O(NlogN), 이분 탐색까지 포함한 전체 시간복잡도는 O(Nlog⁡Nlog⁡109)O(N\log N\log 10^9)O(NlogNlog109)이며, 공간복잡도는 이다.

min​
,
ymax​
]
S
B​
SLS_LSL​
xmin⁡x_{\min}xmin​
SRS_RSR​
xmax⁡x_{\max}xmax​
STS_TST​
ymax⁡y_{\max}ymax​
SBS_BSB​
ymin⁡y_{\min}ymin​
P′
STS_TST​
P′P'P′
xxx
ymax⁡y_{\max}ymax​
STS_TST​
ymin​
LLL
SRS_RSR​
m
i
n
​
+
L
yi≤t≤yi+Ly_i\le t\le y_i+Lyi​≤t≤yi​+L
SLS_LSL​
ttt
yi​≤ymin​+L
  • 두 구간 모두에 속함.
  • 두 구간 모두에 속하지 않음.
  • O(log⁡N)O(\log N)
    O(logN)
    T​
    x≤a+Lx\le a+Lx≤a+L
    xxx
    bbb
    SBS_BSB​
    bbb
    a,ba,ba,b
    1
    )
    ≤
    x≤
    b+
    L
  • x>b+Lx>b+Lx>b+L: 모든 분류의 점.
  • log
    N
    )
    O(N)O(N)
    O(N)