문제 링크
- https://icpc.me/17704
문제 출처
- 2015/2016 JOISC Day1 1번
사용 알고리즘
- 세그먼트 트리
- 스위핑
- DP
시간복잡도
- $O((N+Q) \log (N+Q))$
풀이
$N$개의 점 $(X_i, Y_i)$가 주어지고 쿼리로 $(A, B)$가 주어지면, $X_i \geq A \land Y_i \leq B$인 점들만 고려했을 때 오른쪽 위로 strict하게 올라가는 minimum path cover의 크기를 구하는 문제입니다.
poset에서 minimum path cover의 크기는 maximum anti chain의 크기와 같습니다. 이 문제에서 anti chain은 $X_i \leq X_j \land Y_i \geq Y_j$를 만족하는 경로입니다. 이런 꼴의 경로 중 가능한 길이의 최댓값을 구하면 됩니다.
부등호 방향이 다르면 보기 싫으니까 $y$좌표를 뒤집어서 통일시킵니다. 쿼리로 $(A, B)$가 주어졌을 때 $(A, B)$ 기준 1사분면 또는 축에 있는 점들 중 오른쪽 위로 monotone하게 올라가는 LIS를 구하는 문제가 됩니다.
오른쪽 위로 올라가는 경로 대신 왼쪽 아래로 내려가는 경로를 생각해 봅시다. 이런 형식의 DP는 세그먼트 트리를 들고 $(y, x)$ 내림차순으로 스위핑하면서 계산할 수 있습니다.
쿼리는 $[A, \infty]\times [B, \infty]$ 구간에서의 2차원 최댓값 쿼리라고 생각할 수 있지만 2차원 쿼리를 처리하는 것은 귀찮습니다. 따라서 그냥 쿼리를 오프라인으로 입력받은 다음, DP 계산할 때 스위핑하면서 같이 정답을 구하는 것이 편합니다.
전체 코드
1 |
|