
A. Scrolling Sign
이전 단어의 접미사와 다음 단어의 접두사가 겹치는 경우는 추가적인 문자가 필요하지 않습니다. 해당 부분만 제외하고 세주면 됩니다.
1 | |
B. Special Christmas Tree
리프 노드가 $L$개인 완전 이진 트리에서 리프 노드와 그 부모 사이에 노드를 끼워넣는 방법이 최선입니다.
리프 노드 중 깊이가 최대가 아닌 것들($2^{\lfloor \log_2 L \rfloor + 1}$개)에 먼저 노드를 끼워넣어 최대로 만들어 준 다음 나머지를 계산하면 됩니다.
1 | |
C. 이분 그래프
정점마다 빨간색 혹은 파란색으로 칠해 줍시다. 임의의 정점을 빨간색으로 잡은 뒤 인접한 정점을 모두 파란색으로 칠합니다. 파란색으로 칠한 정점을 기준으로 인접한 정점을 모두 빨간색으로 칠합니다.
만약 인접한데 같은 정점인 경우가 있다면 이분 그래프가 아닙니다.
1 | |
D. 폴리큐브의 겉넓이
인접한 정육면체를 간선으로 이어 컴포넌트의 개수가 1이어야 하고(연결 그래프여야 하고), 중복되는 큐브가 없으면 됩니다.
1 | |
E. Movers
어떤 정점 $v$와 연결된 다른 정점의 수를 $v$의 차수라고 합시다.
차수가 $\sqrt M$을 넘지 않는 정점은 인접한 정점에 바로 값을 더해 줍니다.
차수가 $\sqrt M$을 넘는 정점은 일단 자신에게만 더한 다음 2번 쿼리를 처리할 때 차수가 $\sqrt M$이상인 정점끼리 그래프를 만들어서 처리하면 됩니다.
해당 알고리즘의 시간 복잡도가 $O(Q\sqrt M)$임을 증명해 보겠습니다.
1번 쿼리의 경우 시간 복잡도가 $O(\sqrt M)$이 자명하므로 2번 쿼리에 대해서만 생각해 봅시다.
간선의 개수가 $M$이므로 모든 정점의 차수의 합은 $2M$입니다.
차수가 $\sqrt M$을 넘는 것 중 차수가 가장 큰 정점을 $v$라 하고 그 차수를 $D$라 합시다.
차수가 $\sqrt M$을 넘는 것들로만 이루어진 그래프에서 $v$와 인접한 $D$개의 정점들의 차수는 최소 $\sqrt M$입니다. 따라서 $v$, 그리고 $v$와 인접한 정점들의 차수를 모두 합하면 최소 $\sqrt M (D + 1)$ 입니다. 이는 $2M$보다 작거나 같아야 하므로 $\sqrt M (D + 1) \le 2M$, 따라서 $D < 2\sqrt M$이고 2번 쿼리를 $O(\sqrt M)$에 처리할 수 있습니다.
1 | |
F. Diamond Collector (Silver)
투 포인터 알고리즘과 DP를 이용해 구간 $(i, N]$에서 한 케이스에 담을 수 있는 다이아몬드의 개수를 구해 줍시다.
이후 앞에서부터 투 포인터 알고리즘을 이용해 구간 $[1, i]$에서 한 케이스에 담을 수 있는 다이아몬드의 개수와 $(i, N]$에서 한 케이스에 담을 수 있는 다이아몬드의 개수 합의 최댓값을 출력하면 됩니다.
1 | |
G. 이진수 XOR
$DP[i][j]$를 $i$번째 수 까지만 이용해서 $j$를 만드는데 필요한 최소 xor횟수로 두고 비트필드를 이용한 다이나믹 프로그래밍으로 구해주면 됩니다.
1 | |
H. Oreperations Research
$DP[i][j][k]$를 $i$번째 광차를 큐 $A$의 시작 인덱스가 $j$이고 큐 $B$의 시작 인덱스가 $k$인 상태가 되도록 하면서 광석을 전부 담을 수 있는지로 둡시다.
5중 반복문 동적 계획법을 이용해서 답을 구할 수 있습니다.
1 | |