DOJ logoDOJ
题目
最近添加的题目收藏的题目Workbooks
分类DLC比赛小组团队讨论区
排名
解题数量排行榜连续解题排名DOJ Power 排行榜
评测状态
征题登录注册
DOJ logoDOJ

支持 OI 子任务计分、Elo 等级分和 Discord 账号绑定的社区在线评测系统。

题目
题目列表分类
社区
比赛排名讨论区公告举办外部比赛指南
账号
登录注册评测状态
政策
服务条款DLC 使用规则隐私政策API 文档语言运行环境比赛排名奖励评级与表现
© 2026 DOJ
保留所有权利
题解

Rectangle Tiling

返回题目

题解

직사각형은 첫 번째 행만 덮는 것, 두 번째 행만 덮는 것, 두 행을 모두 덮는 것의 세 종류이다.

두 행을 모두 덮는 직사각형들을 몇 개 선택했다고 하자. 이들은 왼쪽부터 서로 겹치지 않게 놓여야 한다. 연속한 두 전행 직사각형 사이에서는 첫 번째 행과 두 번째 행의 한 행 직사각형들을 서로 독립적으로 최대로 선택할 수 있다.

한 행에서 시작점 sss 이후 선택 가능한 직사각형 중 오른쪽 끝이 가장 작은 것을 고르는 표준 구간 스케줄링 그리디를 생각하자. 그 다음 시작점은 방금 고른 오른쪽 끝이 된다. 각 좌표 xxx의 부모를 이 next(x)(x)(x)의 오른쪽 끝으로 두면 그리디 선택 과정이 트리의 조상 경로가 된다. 따라서 스위프가 한 행 직사각형의 오른쪽 끝 eee를 지날 때, eee의 서브트리에 속하는 모든 시작점의 값에 111을 더하면 된다.

가능한 시작점은 000과 전행 직사각형들의 오른쪽 끝이다. 두 행에서 만든 트리를 각각 DFS하여 한 시작점 sss를 두 DFS 번호의 점 (p1(s),p2(s))(p_1(s),p_2(s))(p1​(s),p2로 나타낸다. 첫 번째 행의 서브트리 증가는 점들의 세로 띠 범위 덧셈, 두 번째 행의 증가는 가로 띠 범위 덧셈이 된다.

이 정적 점들을 2차원 KD Tree에 저장하여 각 노드의 경계 직사각형, 최댓값, lazy 증가량을 관리한다. 세로/가로 띠 업데이트는 O(K)O(\sqrt K)O(K​)에 처리할 수 있다. 열 좌표를 왼쪽에서 오른쪽으로 스위프하며, 전행 직사각형의 왼쪽 끝에서는 현재 전체 최댓값에 111을 더해 그 직사각형을 마지막으로 고르는 DP 값을 구한다. 한 행 직사각형의 오른쪽 끝 업데이트를 처리한 뒤, 전행 직사각형의 오른쪽 끝 좌표를 새 시작점으로 활성화한다.

전체 시간 복잡도는 O(KK+Klog⁡K)O(K\sqrt K+K\log K)O(KK​+KlogK)이다. Solution written by GPT5.6

​
(
s
))