결과
다 풀긴 했는데 F에서 너무 말린 것 같네요…
A. Don’t be late
$D/S \leq T$이면 Yes
, 아니면 No
를 출력하면 됩니다.
저는 실수 오차를 싫어하기 때문에 $D \leq T \times S$로 구현했습니다.
1 |
|
B. Substring
$O(\vert S\vert\vert T\vert)$만에 모든 경우를 다 봐주면 됩니다.
1 |
|
C. Sum of product of pairs
$S = \sum A_i$라고 합시다. 정답은 $(S^2 - \sum (A_i)^2) / 2$가 됩니다.
1 |
|
D. Friends
친구 관계를 그래프로 나타내봅시다. 가장 큰 컴포넌트의 크기가 문제의 정답이 된다는 것을 쉽게 알 수 있습니다.
DFS / BFS / Union-Find 등으로 구현해주면 됩니다.
1 |
|
E. Coprime
모든 수들의 소인수가 겹치지 않는다면 pairwise coprime
입니다.
$\gcd(A_1, A_2, \ldots, A_N) = 1$이라면 setwise coprime
입니다.
소인수 분해와 유클리드 호제법만 잘 사용해주면 됩니다.
여담으로, 저는 pairwise coprime
을 판별할 때 BOJ 8291 Coprime Numbers코드를 재활용했습니다.
8291 Coprime Numbers는 주어진 수열에서 최대공약수가 1인 쌍의 개수를 세는 문제로, 이 문제의 상위호환이라고 볼 수 있습니다. 8291을 풀었다면, E번은 단순히 $cnt = N(N-1)/2$인지만 확인해주면 풀 수 있습니다.
1 |
|
F. I hate Shortest Path Problem
세로 방향 이동 횟수는 행 번호와 동일하기 때문에 가로 방향 이동 횟수만 고려해주면 됩니다.
(i, i번째 열까지 가는데 필요한 가로 이동 횟수)를 set으로 관리합시다.
각 장애물$(A_i, B_i)$마다 구간 $[A_i, B_i]$에 있는 pair를 다 날려준 다음, $B_i+1$번째 열까지 가는데 필요한 가로 이동 횟수를 갱신해주면 됩니다. 이때 $B_i+1$번째 열까지 가는데 필요한 가로 이동 횟수의 최솟값은 아래에 나와있는 3번 연산을 이용하면 됩니다.
문제를 해결하기 위해 필요한 연산은 아래와 같습니다.
- 현재 set에 있는 pair 중 구간 $[A_i, B_i]$에 속하는 pair를 모두 선택해서 없애기
- 모든 $i$에 대해, ($i$번째 열로 가는데 필요한 가로 이동 횟수)의 최솟값 구하기
- $i \in [1, B_i]$인 $i$에 대해 ($i$번째 열로 가는데 필요한 가로 이동 횟수) + $(B_i+1)-i$의 최솟값 구하기
1번 연산은 set에서 lower_bound를 구하고, iterator를 하나씩 이동시키는 것으로 해결할 수 있습니다. 혹은 it = st.erase(it)
와 같이 해도 됩니다.
2번 연산은 세그먼트 트리를 이용해 최소값을 구하면 됩니다. set의 원소가 바뀔 때마다 세그먼트 트리의 원소들도 같이 갱신해주면 됩니다.
3번 연산은 (i번째 열로 가는데 필요한 가로 이동 횟수) - i를 세그먼트 트리로 관리해주면 됩니다. 이때 3번 연산의 결괏값은 seg_query(1, $B_i+1$) + $B_i+1$이 됩니다.
이제 남은 것은, 열심히 구현해주면 됩니다.
KOI’16 초등부 4번 장애물 경기의 상위호환인 것 같습니다.
1 |
|