티스토리 뷰
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
- tree
- CHT
- Sparse Table
- Greedy
- Divide & Conquer
- Floyd-Warshall
- stack
- HLD
- Line sweeping
- ⭐
- graph
- BOJ
- Lazy Propagation
- ioi
- Segment Tree
- DFS
- Parametric Search
- Shortest path
- Fenwick Tree
- Merge Sort
- Interactive
- Persistent Segment Tree
- APIO
- convex hull
- offline
- DP
- Codeforces
- Centroid Decomposition
- Union Find
- Sqrt Decomposition
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |