서론
실제로 참가하였던 대회이기도 하고 풀어볼 만한 문제도 많아 보여서 최대한 업솔빙하였다.
B - Commemorative Dice
단순 구현
C - Dessert Café
임의의 두 아파트 단지를 잇는 경로 사이에 존재하는 candidate site는 good place이다.
임의의 아파트 단지에서 dfs를 돌리면 모든 good place를 찾을 수 있다.
간선의 가중치는 필요하지 않다.
E - Imprecise Computer
각 round의 결과에 대하여 D[i]의 값은 다음과 같이 결정된다.
if (i - 1) vs i의 결과가 동일
if i vs (i + 1)의 결과가 동일
D[i] = 0
else
D[i] = 1
else
if i vs (i + 1)의 결과가 동일
D[i] = 1
else
D[i] = 0 or 2
여기서 알 수 있는 사실은 다음과 같다.
- (i - 1) vs i의 결과가 동일하다면 D[i]는 2 미만이다.
- 그렇지 않다면 D[i]는 3 미만이다.
- (i - 1) vs i의 결과와 D[i]의 값을 이용하여 i vs (i + 1)의 결과를 알 수 있다.
따라서 D[1]부터 D[N]까지 순차적으로 살펴보면 문제를 해결할 수 있다.
G - Mobile Robot
로봇을 차례대로 배치할 때 로봇의 최대 이동 거리를 최소화하는 문제이다.
i번 로봇을 좌표 (x + i * D)에 배치한다고 가정하자.
이때 i번 로봇이 이동하는 거리 B[i]는 다음과 같이 정의된다.
B[i] = x + i * D - A[i];
B[i]가 음수이면 왼쪽으로 이동한다는 것이다.
잘 생각해보면 max(B) = -min(B)를 만족시키는 x가 최적임을 알 수 있다.
이때 로봇의 최대 이동 거리는 max(B) = -min(B) = (max(B) - min(B)) / 2가 된다.
그런데 x와 무관하게 (max(B) - min(B)) / 2의 계산 결과는 항상 동일하다.
따라서 답은 임의의 x에 대하여 (max(B) - min(B)) / 2가 된다.
두 가지 주의 사항이 있다.
첫 번째는 로봇이 역순으로 배치될 수도 있다는 것이다.
따라서 위의 과정을 반대 방향으로 한 번 더 처리해주어야 한다.
두 번째는 부동 소수점 오차이다.
답은 항상 x / 2 꼴이므로 정수 자료형을 사용하되 소수점 아래 부분은 if 문으로 출력해주면 된다.
H - Needle
DO YOU KNOW FFT
J - Switches
각 i에 대하여 Gaussian Elimination을 수행하면 전체 시간 복잡도 O(N^4)에 문제를 해결할 수 있다.
하지만 제한이 크기 때문에 O(N^4)는 허용되지 않는다.
Gaussian Elimination으로 주어진 행렬의 역행렬을 구하면 O(N^3)에 문제를 해결할 수 있다.
역행렬이 존재한다면 답은 역행렬로부터 구할 수 있다.
그렇지 않다면 답은 -1이 된다.
선형대수학 지식이 부족하여 원리는 정확히 이해하지 못하였다.
A - Autonomous Vehicle
좌표 제한이 크기 때문에 나름 효율적으로 구현해야 한다.
모든 도로에 대하여 교차점을 구하고 이동 시에는 각 도로의 시작점과 끝점 그리고 교차점만을 고려하면 된다.
그런데 구현이 많이 더럽다.
집에서 음악 들으면서 평온한 상태에서 풀어도 1시간이 넘게 걸렸는데 대회 중에 풀 수 있을지가 의문이다.
I - Stock Analysis
세 가지 풀이를 소개한다.
모든 풀이는 구간 트리와 offline query를 동반한다.
첫 번째 풀이는 Merge Sort Tree의 아이디이를 이용한다.
query는 e의 오름차순으로 정렬한다.
Segment Tree의 각 노드는 담당 구간의 모든 누적 합을 set으로 관리하도록 한다.
각 query는 구간 [s, e]를 담당하는 모든 노드에 대하여 u에 대한 upper_bound를 구하여 처리할 수 있다.
이 풀이는 TLE를 받지만 간단한 아이디어로 접근할 수 있어서 설명하였다.
두 번째 풀이는 크기가 O(N^2)인 Segment Tree를 이용한다.
마찬가지로 query는 e의 오름차순으로 정렬한다.
Segment Tree는 각 누적 합 i에 대하여 S[j .. k] = i를 만족하는 j의 최댓값을 관리하는데 이를 A[i]라고 하자.
각 query는 i <= u이고 A[i] >= s를 만족하는 i의 최댓값을 구하여 처리할 수 있다.
값의 범위가 넓기 때문에 좌표 압축이 필요하다.
세 번째 풀이는 2D Fenwick Tree를 이용한다.
query는 u의 오름차순으로 정렬한다.
문제를 변형하면 직사각형 내의 최댓값을 구하는 문제가 된다.
하지만 일반적으로 Fenwick Tree는 최댓값 연산을 수행할 수 없다.
각 직사각형의 좌표에 주목해보자.
좌상단 꼭짓점의 좌표는 (s, s)이고 우하단 꼭짓점의 좌표는 (e, e)이다.
a > b일 때 좌표 (a, b)의 값은 0이므로 각 좌표를 (s, 1)과 (N, e)로 변형할 수 있다.
인덱스 [i, j]에 대한 업데이트를 인덱스 [N - i + 1, j]에 대한 업데이트로 바꾸어 수행해보자.
놀랍게도 최댓값 query를 수행할 수 있게 된다.
L - Two Buildings
식을 잘 정리하면 dnc opt가 가능함을 알 수 있다.
WF 문제인 14636번과 매우 유사하다.
D - Electric Vehicle
Pass
F - Ink Mix
Pass
K - Tiling Polyomino
Pass
끝
끝
'일기' 카테고리의 다른 글
BOJ 2156번 - 포도주 시식 (0) | 2023.02.14 |
---|---|
BOJ 26101번 - 링크와 스타트 2 (0) | 2023.02.10 |
2023년 1월 13일 일기 (2) | 2023.01.14 |
BOJ 19089번 - 파일 합치기 4 (0) | 2023.01.07 |
Good Bye, BOJ 2021! (0) | 2023.01.02 |