본문 바로가기

AtCoder

AGC 038

https://atcoder.jp/contests/agc038/tasks

ABCDEF 6문제 중 ABD 3문제를 풀었다. 레이팅이 오르긴 했지만, C를 못 푼 것이 아쉽다. 정수론이라서 풀려는 시도조차 안 했는데, 쉬운 문제였다....

 

A. 01 Matrix

쉬운 문제였지만 나는 모르겠어서 B를 먼저 풀었다.

위 왼쪽의 A*B크기 직사각형과 아래 오른쪽의 (H-A)*(W-B)크기 직사각형은 0으로 채우고 나머지는 1로 채우면 된다. 

 

B. Sorting a Segment

주어진 수열에서, 길이 $K$의 구간을 선택해서 그 구간을 정렬한다. 이 연산을 1번만 시행하여 얻을 수 있는 결과를 구하는 문제다.

위치 $i$에 이 연산을 시행하면 $[i, i+K-1]$ 구간이 정렬된다고 하자. 

$i$에 연산을 시행한 것과 $j$에 연산을 시행한 결과가 같으려면 $(i < j)$

1. $j\leq i+K-1$(구간이 겹친다) : $[i, j+K-1]$ 구간에서 작은 원소들은 $[i, j-1]$에 정렬된 순서로 있고, 큰 원소들은 $[i+K, j+K-1]$에 정렬된 순서로 있다.

2. $j > i+K-1$(구간이 겹치지 않는다) $[i, i+K-1]$과 $[j, j+K-1]$ 구간이 둘 다 이미 정렬된 상태이다.

1의 경우, $i, i+1, ..., j$에 연산을 시행한 결과는 모두 같다. 따라서 $i$와  $i+1$에 연산을 시행한 결과가 같은지를 모든 $i$에 대해 구하면 된다. 이는 구간 최댓값과 구간 최솟값을 통해 확인할 수 있다.(Segment Tree 또는 Sliding Window 사용)

2의 경우는 1에서 구한 구간 최댓값과 최솟값이 증가하는지 확인하면 된다. 나는 이를 연속한 수의 차이를 구한 후 최솟값이 0보다 큰지 확인하였다.  (마찬가지로 Segment Tree 또는 Sliding Window 사용)

 

C. LCMs

주어진 수열에 대해, $lcm(a_i, a_j)$의 합을 구하는 문제이다. ($0\leq i < j < N$)

$lcm(a_i, a_j) = a_i * a_j / gcd(a_i, a_j)$이므로 각 $k$에 대해, $gcd(a_i, a_j) = k$인 $i, j$의 $a_i * a_j$의 합을 구하자. 이는 에라토스테네스의 체를 응용하여 구할 수 있다.

우선, $0 \leq i < j < N$을 $0\leq i < N, 0\leq j < N$으로 바꾸자. 이렇게 구한 결과에서 $\sum a_i$를 뺀 후 2로 나누면 답이 된다.

배열 s에 대해 s[k] = ($a_i$가 k의 배수인 $a_i$들의 합)이라 하자. 이는 에라토스테네스의 체를 응용하면 구할 수 있다. 각 s[k]의 값들을 제곱하면 ($a_i, a_j$가 k의 배수인 $i, j$에 대해 $a_i*a_j$의 합)이 된다. 여기서 ($gcd(a_i, a_j)$가 k보다 큰 k의 배수인 $i, j$에 대해 $a_i*a_j$의 합)을 빼주면 된다. 마찬가지로 에라토스테네스의 체를 응용하면 구할 수 있다.

에라토스테네스의 체는 시간복잡도가 $O(NloglogN)$이다. 따라서 이 문제 역시 $O(NloglogN)$으로 풀 수 있다.

 

D. Unique Path

정점이 $N$개이고 간선이 $M$개인 어떠한 연결 그래프에 대한 정보가 $Q$개 주어진다 : $A_i$와 $B_i$를 잇는 경로가 유일하다/2개 이상이다. $C_i$가 0이면 경로가 유일하고, 1이면 2개 이상인 것이다.

이러한 그래프가 존재하는지 판별하는 문제이다.

연결 그래프는, scc들 사이를 트리 형태가 연결한다. 두 정점 사이에 경로가 유일하다는 것은 이 두 정점이 같은 트리부분에 속한다는 것을 의미한다. 따라서 경로가 유일한 $A_i, B_i$를 같은 component로 묶어준다. 같은 component 안에 있는 $A_i, B_i$에 대해 $C_i$가 1이면 이러한 그래프는 없다. 

이제 특정 component들 사이를 잇는 경로가 2개 이상 존재하도록 엣지를 이어야 한다. 엣지 개수의 최댓값은 (component의 개수)C2이다. 엣지 개수의 최솟값은 $C_i$가 1인 $i$가 존재하면 $N$, 그렇지 않으면 $N-1$이다. $M$이 엣지 개수의 최솟값과 최댓값 사이인지 판별하면 된다.

한 가지 더 확인할 점은, component가 2개이면서 경로가 2개 이상 존재할 수 없다는 것이다.

위에서 설명한 조건들을 모두 확인해주면, 답을 $O(N)$으로 구할 수 있다.

 

E. Gachapon

포함 배제의 원리를 이용한 어려운 확률 문제이다. 추가 예정

 

F. Two Permutations

flow를 이용하는 문제이다. 내가 모르는 알고리즘(flow, string matching 등) 중의 하나였는데, 이 문제를 풀기 위해 공부했다.

두 permuation $P$와 $Q$가 주어진다. 두 permuation $A$와 $B$를 만들어야 한다. 모든 $i$에 대해 $A_i = i$ 또는 $A_i = P_i$여야 하고, $B$에 대해서도 마찬가지로 $B_i = i$ 또는 $B_i = Q_i$여야 한다. 이러한 $A$와 $B$에 대해 $A_i \neq B_i$인 $i$의 개수의 최댓값을 구하자. 

permuation $P$를 그래프로 나타내면 여러 사이클들이 생기게 된다. 각 사이클의 원소들은 값이 모두 $P_i$이거나 모두 $i$이다. $i$가 $P$에서 속하는 사이클을 $x(i)$라 하고, $Q$에서 속하는 사이클을 $y(i)$라 하자. $P$의 어떤 사이클 $x$에 대해 원소들의 값이 모두 $i$이면 $v(x) = 0$, 그렇지 않으면 $v(x) = 1$이라 하자. $P$의 어떤 사이클 $y$에 대해서는 반대로 원소들의 값이 모두 $i$이면 $v(y) = 1$, 그렇지 않으면 $v(y) = 0$이라 하자.

이제 $A_i = B_i$인 $i$의 개수를 최소화하자.

1. $P_i= i, Q_i = i$ : $A_i = B_i$이다.

2. 위의 경우에 해당되지 않고 $P_i = i$ : $v(y(i)) = 1$이면 $A_i = B_i$

3. 위의 경우에 해당되지 않고 $Q_i = i$ : $v(x(i)) = 0$이면 $A_i = B_i$

4. 위의 경우에 해당되지 않고 $P_i = Q_i$ : $v(x(i))$와 $v(y(i))$의 값이 다르면 $A_i = B_i$

5. 위의 경우에 해당하지 않음 : $v(x(i)) = 0$이고 $v(y(i)) = 1$이면 $A_i = B_i$

이는 min-cut으로 바꿀 수 있다. 각 $v$에 0이 배정되면 source쪽 component에 연결하고, 1이 배정되면 sink 쪽 component에 연결한다고 생각하면 위 5가지 경우가 각각 간선이 된다. 

정점과 간선이 모두 $O(N)$개이고 간선의 최대 유량이 모두 1이므로 Dinic의 알고리즘을 활용하면 $O(N \sqrt{N})$으로 해결할 수 있다. 

'AtCoder' 카테고리의 다른 글

AGC 039  (0) 2019.10.27