PS

17972 Network Vulnerability

dadas08 2025. 1. 4. 01:42

$N$개의 구간이 주어집니다. 어떤 겹치는 두 구간 사이에 간선을 이어서 만든 그래프를 $G$라 합시다.

$k = 0, 2 .. N-1$에 대해, $G$에서 $k$개의 정점을 지웠을 때 남는 컴포넌트의 수의 최댓값을 구하는 문제입니다.

 

$O(N^3)$ Solution

일단 좌표압축을 통해 모든 좌표를 $[1, 2N]$으로 바꿔줍시다.

$DP[i][j]$를 $[1, i]$에 포함되는 구간으로만 이루어진 $j$개의 컴포넌트가 있을 때, $[1, i]$ 안에 남길 수 있는 구간 개수의 최댓값이라 정의합니다. 또, $S[i][j]$를 $i$ 에 왼쪽 끝점이 있고 오른쪽 끝점이 $j$이하인 구간의 개수라 합시다.

 

$x = k$에서 슥 자른다고 생각하면, 다음과 같은 전이를 생각해 볼 수 있습니다

$ DP[i][j] = max(DP[i][j], DP[k-1][j-1] + S[k][i])$  단 $(S[k][i] \geq 1)$

또 컴포넌트를 늘리지 않는다 생각하면

$DP[i][j] = max(DP[i][j], DP[i-1][j])$

 

$DP[i][j]$값은 $O(N^3)$에 쉽게 구할 수 있습니다.

실제 답을 구하는 과정은 $DP[2N][i] = x$라 하면, $N-x$개 이상 $N-i$이하의 정점을 지워서 $i$개의 컴포넌트를 만들 수 있다는 뜻과 동치이므로 $k\in [N-x, N-i]$인 $k$에 대해 $ans[k] = max(ans[k], i)$를 해주면 됩니다.

 

$O(N^2logN)$ Solution

 

$DP[i][j]$를 계산할 때, $i$를 하나씩 늘려가며 갱신해봅시다. 전이 가능한 모든 쌍을 둘러보면 $O(N)$이므로 위와 같이 세제곱이 됩니다. 하지만 세그먼트 트리를 이용하면 $O(logN)$에 전이가 가능합니다.

 

세그먼트 트리의 $i$번째 값을 DP[i][j-1]로 갱신해줍시다. 문제는 여기서 $S[i][j]$도 더해줘야 한다는 것인데, 이는 $i$에 증가에 따라 추가로 범위에 포함되는 구간마다 1을 더해줌으로써 해결할 수 있습니다.

즉, 새로운 구간이 들어올 때마다, 적당한 $[l, r]$에 $1$을 더해줌으로써 $S[i][j]$를 더한 것과 같은 기능을 구현할 수 있습니다.

구간 $add$ 연산과 구간 $min$연산 2개를 지원하는 레이지 세그먼트 트리를 짜면 됩니다.

총 시간복잡도는 $O(N^2logN)$입니다.

 

 

 

'PS' 카테고리의 다른 글

18448 Best Subsequence  (1) 2025.01.04
17674 특별관광도시  (1) 2025.01.04
10008 Polarization  (3) 2025.01.04
27355 Paths  (1) 2025.01.04
27292 Fruits  (3) 2025.01.03