Skip to content

Commit

Permalink
2024 본선 타일 마스터의 시련 문제 풀이 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
myungwoo committed Oct 28, 2024
1 parent 785f3dc commit 74d8d8c
Showing 1 changed file with 42 additions and 1 deletion.
43 changes: 42 additions & 1 deletion pages/2024/final_9.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -127,5 +127,46 @@ YNNY
## 해설

<Solution>
준비 중입니다.
편의를 위해, 빛의 문양이 위를 향하는 타일을 $0$, 어둠의 문양이 위를 향하는 타일을 $1$로 표현하자. 아름다운 패턴은 스크롤을 사용하여 모든 타일을 $0$으로 만들 수 있는 격자판의 상태를 뜻한다.

$N$행 $M$열의 격자판에서 각 타일의 상태를 $W_{i,j}$로 정의하자. 여기서 $W_{i,j} = 0$이면 $i$행 $j$열의 타일이 빛의 문양을 위로 향하고 있음을, $W_{i,j} = 1$이면 어둠의 문양이 위로 향하고 있음을 나타낸다. 타일을 뒤집는 연산은 타일의 상태를 $0$과 $1$ 사이에서 전환하는 것이므로, 모든 연산은 $\bmod\,2$로 생각할 수 있다. 타일의 상태 변화를 추적하기 위해, 누적 합과 유사한 개념인 **변환값 배열** $w_{i,j}$를 정의하자:
$$w_{i,j} = W_{i,j} - W_{i-1,j} - W_{i,j-1} + W_{i-1,j-1} \pmod{2}$$

단, $W_{i,0}$과 $W_{0,j}$는 모두 $0$으로 간주한다. 이렇게 정의하면,
$W_{i,j}$는 다음과 같이 표현할 수 있다:
$$W_{i,j} = \sum_{1 \le x \le i,\ 1 \le y \le j} w_{x,y} \pmod{2}$$

타일 마스터가 $[sx, ex] \times [sy, ey]$ 범위의 타일을 뒤집는 연산은 $w$ 배열에서 다음과 같은 변화를 일으킨다:

$$
\begin{align*}
w_{sx, sy} &\leftarrow w_{sx, sy} + 1 \pmod{2} \\
w_{sx, ey+1} &\leftarrow w_{sx, ey+1} - 1 \pmod{2} \\
w_{ex+1, sy} &\leftarrow w_{ex+1, sy} - 1 \pmod{2} \\
w_{ex+1, ey+1} &\leftarrow w_{ex+1, ey+1} + 1 \pmod{2}
\end{align*}
$$

따라서, 모든 타일에 대한 $w_{i,j}$ 값을 관리함으로써 타일의 상태 변화를 추적할 수 있다.

빛의 스크롤의 사용은 $sy = 1, ey = M$ 인 경우로 생각할 수 있고, 어둠의 스크롤의 사용은 $sx = 1, ex = N$ 인 경우로 볼 수 있다. 따라서, 스크롤을 사용하여 모든 타일을 $0$으로 만들기 위해서는 $w_{i,j}$에 대해 다음이 성립해야 함을 의미한다:
- 모든 $1 < i \le N$, $1 < j \le M$에 대해 $w_{i,j} = 0$이어야 한다.
- $w_{i,1}$과 $w_{1,j}$는 스크롤을 통해 조작할 수 있으므로, 적절한 스크롤 사용으로 $0$으로 만들 수 있어야 한다.

타일 마스터가 타일의 문양을 조작할 때마다 바뀌는 $w_{i,j}$값이 $4$ 개이므로, 이 값들은 계속 들고 있을 수 있다. $1 < i \le N, 1 < j \le M$ 인 $i,j$에 대해 $w_{i,j} = 0$을 만족할 때, $w_{i,1}$과 $w_{1,j}$들의 값으로부터 아름다운 패턴인지 효율적으로 판단할 수 있으면 문제를 해결하는 데에 충분하다.

$i$ 번째 빛의 스크롤을 사용하면 $1 \le s \le N+1-A_i$을 만족하는 $s$ 를 하나 골라 $w_{s,1}$과 $w_{s+A_i,1}$에 1을 더하는 연산을 할 수 있다. $j$번째 어둠의 스크롤을 사용하면 $1 \le t \le M+1-B_j$을 만족하는 $t$ 를 하나 골라 $w_{1,t}$과 $w_{1,t+B_j}$에 1을 더하는 연산을 할 수 있다. 이를 통해 $w_{i,1}$과 $w_{1,j}$들을 모두 $0$으로 만들 수 있는지 확인하면 충분하다.

빛의 스크롤로 모든 $w_{i,1}$들을 $0$으로 만들 수 있는지, 그리고 어둠의 스크롤로 모든 $w_{1,j}$들을 $0$으로 만들 수 있는지 확인하면 충분하다. 빛의 스크롤로 모든 $w_{i,1}$들을 $0$으로 만들 수 있는지를 확인하는 방법은 다음과 같다.

$1$번부터 $N+1$번 까지 정점이 있고, $1 \le i \le S$ 에 대해 번호가 $A_i$ 만큼 차이나는 모든 정점 쌍을 간선으로 연결한 그래프를 생각해 보자. 그래프의 $i$번 정점에 있는 값을 $w_{i,1}$라고 할 때, 간선의 양 끝점의 값을 반전시키는 연산으로 모든 값을 $0$으로 만들 수 있으면 된다. 그리고 이는 각 컴포넌트에서 $w_{i,1}$의 합이 짝수인 것과 동치가 된다. 따라서, 그래프의 컴포넌트를 알면 각 컴포넌트 별 $w_{i,1}$의 값들의 합을 관리함으로써 문제를 해결할 수 있다.

다음과 같은 문제를 생각해보자:
그래프 $G$에 $1, 2, \ldots, n$번의 $n$ 개의 정점이 있을 때, 다음과 같은 쿼리들을 처리하며 disjoint set union 자료구조를 유지하여라.

$\text{Uni}(k, a, b)$ : $0 \le i < k$인 모든 $i$에 대해 $G$에 간선 $(a+i, b+i)$ 추가

$level = 0, 1, \ldots , \log n$ 인 그래프를 생각하자. $level = i$ 인 그래프에서 정점 $a$와 $b$가 같은 컴포넌트라는 것은 $G$에서 $0 \le t < 2^i$ 인 $t$에 대해 $a+t$와 $b+t$가 같은 컴포넌트임을 뜻한다. 그러면 $\text{Uni}(k,a,b)$ 쿼리는 처음에 $level = \lfloor \log k \rfloor$인 그래프에 간선을 추가하고, 높은 level의 그래프로부터 낮은 level의 그래프로 전파하는 방식으로 ($level = i$인 그래프에서 간선 $(a,b)$가 추가되면 $level = i-1$인 그래프에 $(a,b), (a + 2^{i-1}, b+2^{i-1})$ 추가) Union find를 해주면 최종적으로 $level = 0$은 $G$와 동일한 컴포넌트 구조를 가지게 된다. 이 때 시간복잡도는 $\log n$ 개의 그래프에서 union find가 이루어지므로 모든 쿼리가 끝났을 때의 그래프의 연결 상태는 $O((n+Q) \log n \cdot \alpha(n))$ 시간에 효율적으로 계산된다. 빛의 스크롤에 관한 문제는 이 문제의 subproblem이므로, 그래프의 컴포넌트를 계산할 수 있다.

따라서, 처음에 주어진 $A_i$와 $B_i$들을 바탕으로 그래프의 컴포넌트를 계산해 놓으면 타일 마스터가 타일의 문양을 조작할 때마다 $w_{i,j}$들의 값의 변화를 관리하면서 그래프에서 모든 컴포넌트가 짝수 합을 가지는지까지 체크해주면 아름다운 패턴인지 아닌지를 판정할 수 있다.
</Solution>

0 comments on commit 74d8d8c

Please sign in to comment.