문제 링크
- http://icpc.me/17526
문제 출처
- 2019 서울 리저널 인터넷 예선 J번
사용 알고리즘
- Li-Chao Tree
시간복잡도
- O(NlgN)
풀이
wait[i] = i번째 우주선을 갈아타는 데 걸리는 시간, speed[i] = i번째 우주선의 속도, dist[i] = 시작점부터 i번째 지점까지의 거리
라고 정의합시다.
먼저, 첫 번째 우주선을 타고 시작점에서 x까지 가는 데 걸리는 시간 f_1(x) = speed[1] * x + wait[1]입니다.
각 지점마다 우주선을 갈아탈 수 있기 때문에, 갈아타는 경우도 고려를 해줘야 합니다.
당연히 우주선을 갈아타더라도 f_i(x)는 기울기가 speed인 일차함수로 나타낼 수 있습니다.
i번 지점까지 가는 데 now만큼의 시간이 걸렸다고 합시다. i번 지점에서 우주선을 갈아타는 경우를 생각해보면
기울기는 당연히 speed[i]이고, y절편은 wait[i] + now - speed[i] * dist[i]인 직선으로 나타낼 수 있습니다.
결국 이 문제는 f_i(x) = speed[i] * x + wait[i] + now - speed[i] * dist[i] 형태로 나타낼 수 있는 n개의 일차함수에서 특정 지점의 최솟값을 여러 번 구하는 문제로 바뀌게 되고, 이는 li-chao tree를 이용해 쉽게 구할 수 있습니다.
전체 코드
1 |
|