문제 링크
- http://icpc.me/17442
사용 알고리즘
- 듀얼 그래프
풀이
평면 그래프에서는 $V-E+F=C+1$가 성립합니다.
그래프에 변형을 가했을 때 컴포넌트 개수의 변화량 $\Delta C$는 $\Delta V - \Delta E + \Delta F$입니다. 주어진 그래프에서 $C = 1$이므로 $\Delta C+1 = \Delta V - \Delta E + \Delta F + 1$을 구하면 됩니다.
직선 A, B로 그래프를 삼분한다고 합시다.
- $\Delta E = $ (A를 지나는 간선의 개수 + B를 지나는 간선의 개수)
- $\Delta V = $ 2(A를 지나는 간선의 개수 + B를 지나는 간선의 개수) $ = 2\Delta E$
- $\Delta F = $ -(A 혹은 B를 지나는 면의 개수)
- $\Delta C = \Delta V - \Delta E + \Delta F = \Delta E + \Delta F$
$\Delta E$는 간선의 양 끝점의 x좌표를 구한 뒤 변홧값 배열을 통해 쉽고 빠르게 구할 수 있습니다. $\Delta F$를 빠르게 구해야 합니다.
y축에 평핸한 직선을 그어서 face를 분할하는 것이므로, 일단 각 face의 x좌표 범위를 구해봅시다. face의 x좌표 범위는 Dual Graph를 만드는 느낌으로 Union Find를 해주면 구할 수 있습니다.
face의 x좌표 범위를 $[L, R]$이라고 합시다. 모든 face에 대해 $[L, R]$을 구해서 2차원 평면 상에 플로팅해줍시다. $L \leq R$이기 때문에 모든 점은 $y = x$ 그래프 위쪽에 있습니다.
직선 A, B에 의해서 x좌표 범위가 $[L, R]$인 face가 잘리기 위해서는 $L \leq A$ 또는 $B \leq R$를 만족해야 합니다.
$L \leq A$를 만족하는 점들은 아래 그림의 빨간색 영역 안에 있는 점들입니다.
$B \leq R$을 만족하는 점들은 아래 그림의 파란색 영역 안에 있는 점들입니다.
$L \leq A$ 또는 $B leq R$을 만족하는 점들의 개수를 구하기 위해서는 빨간색 영역 안에 있는 점들의 개수와 파란색 영역 안에 있는 점들의 개수를 구해서 더한 뒤, 아래 그림의 파란색 영역 안에 있는 점들의 개수를 빼주면 됩니다.
직사각형 영역에 있는 점의 개수는 PST나 Merge Sort Tree를 이용해 구해주면 됩니다.
전체 코드
1 |
|