티스토리 뷰
처음으로 블로그를 만들어 봤다.
무엇을 적어야할지 잘 모르겠어서 일단 재밌었던 문제의 풀이를 몇 개 적어봤다.
PPC 2018 F. Edge Coloring
그래프가 트리일 경우를 생각해 봅시다.
트리의 리프에서부터 루트 아래까지 올라가며 부모 정점으로 가는 간선을 색칠할 때
- 리프일 경우, 무조건 색칠
- 리프도 루트도 아닐 경우, 자식으로 가는 간선 중 색칠된 간선이 짝수일 경우 색칠
이러한 방식으로 각 간선의 색칠 여부를 유일하게 결정할 수 있습니다.
색칠 후에 루트 정점의 차수는 짝수일 수도 홀수일 수도 있는데,
모든 정점의 차수 합은 항상 짝수이므로
그러므로 그래프가 트리일 때는
풀이를 확장하여 일반적인 연결 그래프에서 문제를 풀어봅시다.
그래프의 스패닝 트리를 하나 잡고, 스패닝 트리에 포함되지 않은 간선은 아무렇게나 색칠합니다.
이 때의 스패닝 트리의 색칠 또한 유일합니다.
트리에서의 풀이에서 각 정점의 차수의 홀짝 여부만 다르기 때문에, 비슷한 귀납적 방식으로 해결할 수 있습니다.
(물론
결국 문제의 답은
이 홀수라면 이 짝수라면
이 됩니다.
실제로는 그래프가 연결 그래프가 아닐 수 있기 때문에 각 컴포넌트에 대해서 정점과 간선의 개수를 세어 경우의 수를 모두 곱해야 합니다.
CEOI 2019. Dynamic Diameter
정점
그러므로
복잡해 보이지만, 이렇게 선택하는 방식은 Euler Tour Tree를 사용하여 1차원적으로 표현할 수 있습니다.
트리를 DFS로 순회하면서 각 정점을 처음 방문할 때와 자식 정점에서 돌아올 때 Euler Tour 배열에 정점을 추가합니다.
(문제의 예제 1번 트리의 경우,
결국 트리에서
선택한 세 수가 순서대로
결론적으로, 이 문제는 다음과 같은 문제로 환원됩니다:
크기가
- 1. 어떤 세 정수
에 대해 의 최댓값을 계산 - 2. 세 정수
이 주어지면 에 를 더함
1번 쿼리가 지름을 구하는 쿼리에 해당하고, 2번 쿼리는 간선의 가중치를 변경할 때 서브트리에 있는 정점들의 깊이를 변경하는 쿼리에 해당합니다. (Euler Tour 배열에서 어떤 서브트리의 정점들은 모두 연속되어 있습니다.)
이 쿼리를 해결하기 위해 세그먼트 트리를 사용해 봅시다.
- 2번 쿼리는 단순한 Lazy Propagation를 통해 해결할 수 있습니다.
- 1번 쿼리가 문제인데, 각 구간에서 다음과 같은 5개의 수를 정의합니다:
- mx : 구간 최댓값
- mn : 구간 최솟값
- left : 구간에서 두 수 p, q
를 선택했을 때, 의 최댓값 - right : 구간에서 두 수 p, q
를 선택했을 때, 의 최댓값 - answer : 구간에서의 쿼리 1의 답
- 세그먼트 트리의 어떤 구간에 대해 그 구간을
, 자식 구간중 왼쪽 구간과 오른쪽 구간을 각각 이라 하면 - 답은 루트 구간의 answer값이 됩니다.
총 시간복잡도는
ARC 112 D. Skate
D - Skate
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
atcoder.jp
어떤 칸에서 모든 칸을 지나갈 수 있을 조건을 생각해 봅시다.
만약 그 칸에서 시작하여 모든 행에서 멈출 수 있거나 모든 열에서 멈출 수 있다면 모든 칸을 지나갈 수 있습니다.
그렇지 않다면 멈출 수 없는 행과 멈출 수 없는 열이 동시에 존재하고, 이 행과 열이 겹치는 칸은 지나갈 수 없습니다.
이 관찰을 토대로 그래프를 사용해 문제를 풀 수 있습니다.
각 행과 열에 대해 그 줄을 대표하는 정점을
이 그래프에서 어떤 두 행을 대표하는 두 정점 사이에 경로가 존재한다면, 한 행에서 시작하여 다른 행에서 멈출 수 있고 열에 관하여도 마찬가지입니다.
즉, 어떤 칸에서 시작하여도 모든 칸을 지나갈 수 있다는 것은 이 그래프에서 모든 행이 연결되어 있거나 모든 열이 연결되어 있는 것과 동일합니다.
#인 칸을 하나 추가하여 두 행을 연결시킬 수 있으므로 모든 행을 연결시키기 위해 필요한 최소 변경 횟수는 (행만을 보았을 때 컴포넌트의 개수) - 1이 됩니다.
열에 대해서도 똑같으므로, 둘 중 작은 값이 정답이 됩니다.
Open Cup GP of Tokyo. Bit Operation
두 수를 골랐을 때 추가되는 수는
현재 배열의 크기가
마지막으로 남은 수의 위치를
모든
'PS' 카테고리의 다른 글
PS 문제 풀이 [2021.10] (2) | 2021.10.26 |
---|---|
PS 문제 풀이 [2021.8] (0) | 2021.08.19 |
PS 문제 풀이 [2021.6] (0) | 2021.06.07 |