DOJ logoDOJ
問題
最近追加された問題保存した問題Workbooks
カテゴリDLCコンテストグループチーム掲示板
ランキング
正解数ランキングストリークランキングDOJ Powerランキング
提出状況
問題募集ログイン新規登録
DOJ logoDOJ

OI形式のサブタスク採点、Eloレーティング、Discord連携を備えたオンラインジャッジです。

問題
問題一覧カテゴリ
コミュニティ
コンテストランキング掲示板お知らせ外部のコンテストを開催するガイド
アカウント
ログイン新規登録ジャッジ状態
ポリシー
利用規約DLCの利用規則プライバシーAPI 文書言語ランタイムコンテストの順位報酬レーティングとパフォーマンス
© 2026 DOJ
All rights reserved
解説

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