티스토리 뷰

IOI

IOI 2011 Day 1

arnold518 2019. 11. 24. 02:10

https://oj.uz/problems/source/20


1. garden


첫 번째로, 각 정점마다 상태가 2가지가 있다.

1. 최솟값 간선으로 갈 수 있다. ( 이 간선을 전에 안 지남 )

2. 최솟값 간선으로 갈 수 없어서 두번째 최솟값 간선으로 간다. ( 최솟값 간선을 이미 지남 )


따라서 노드들의 상태를 위의 1, 2번 상태 2개로 나누어 만들자.

0~N-1 : 1번 노드 / N~2N-2 : 2번 노드


이제 각 노드들에서 다른 노드로 상태가 유일하게 정해지니, outdegree = 1인 그래프라고 생각할 수 있고, 이를 통해 Functional Graph 라는 것을 알 수 있다.


이제 마지막으로 원래 문제로 돌아가서 어떤 정점 P로부터 K번 간선을 지나고 얻을 수 있는 경로를 구해주면 된다. 일단 outdegree = 1을 간선들을 모두 뒤집어 indegree = 1로 만들고 P에서부터 dfs를 돌자.


functional graph의 특징상 중심에 사이클이 하나 있고 그 주변에 트리 여러개가 달린 모양이다. 이 꼴로 보아 P, P+N번 정점 2개에서 dfs를 돌면서 깊이가 x인 정점의 수들을 더해주면 되고, 사이클로 인한 주기성까지 생각하면 가장 간단한 방법이 O(NQ) 로 해결할 수 있다. 이때 주의할 정점은 도착해야 하는 정점은 모두 1번 종류여야 한다는 것이다.


2. race


이 문제를 풀기 위해서 Centroid Decomposition을 사용한다.

거의 Centroid Decomposition의 기본 연습 문제와도 같은 간단한 문제이다.


어떤 Centroid 에서 거리가 x (x<=L) 인 정점까지의 최소 간선 수를 저장하는 배열을 만들고, 이 배열을 관리하면서 이 Centroid 가 해당되는 부분의 트리에 대해서 dfs를 돌면서 계산해주면 된다.


따라서 전체 시간 복잡도는 O(NlgN) 이다.


3. ricehub


첫 번째로 어떠한 특정한 구간의 쌀들을 모두 한 곳으로 옮기기 위해서 어디에 쌀 창고를 설치해야 할까?

홀수이면 정확히 가운데, 짝수이면 가운데와 가운데+1의 아무 곳에 위치해도 된다.


이제 어떠한 구간을 잡았을 때 비용을 쉽게 구할 수 있고, 이 비용이 B를 넘지 않을 때 이 구간의 최대 길이를 구하는 것이 문제이다. 


구간 [l, r]보다는 구간 [l, r+1]의 비용이 더 크다는 것은 자명하다. 따라서 Two Pointer 을 이용한 Sliding Window 를 이용하여 최종 시간복잡도 O(N) 안에 쉽게 해결할 수 있다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함