-
BOJ 17665 Triple JumpProblem Solving/Solution Sketch 2023. 2. 1. 10:32
JOI Open Contest 2019 #1 三段跳び(Triple Jump)
문제 설명
직선 위에 N개의 구역이 있으며, i번 구역의 점수는 A[i]이다.
‘3단 점프’란, 다음의 조건을 만족하는 세 개의 구역 (a,b,c)의 순서쌍이다.
- a<b<c
- b−a<c−b
3단 점프의 점수는 A[a]+A[b]+A[c], 즉 3단 점프에 속하는 세 구역의 점수의 합이다.
Q개의 쿼리 (l,r)이 주어진다. 각 쿼리에서는, l≤a<b<c≤r을 만족하는 3단 점프 (a,b,c)들의 점수의 최댓값을 구하여야 한다.
필요한 관찰
다음과 같은 3단 점프 (a,b,c)는 의미가 없다는 것을 알 수 있다.
- a<d<b이며, A[a]≤A[d]인 d가 존재한다.
이 경우, (a,b,c)보다 (d,b,c)가 항상 이득이므로 (a,b,c)는 고려할 필요가 없다.
다음과 같은 3단 점프 (a,b,c) 또한 의미가 없다.
- a<d<b이며, A[b]≤A[d]인 d가 존재한다.
이 경우, (a,b,c)보다 (a,d,c)가 항상 이득이므로 (a,b,c)는 고려할 필요가 없다.
b를 고정하여 생각해보면, 위의 조건을 만족하는 (a,b)쌍은 최대 2N개이다.
Full Solution
이와 같이 유효한 (a,b) 순서쌍들의 개수를 O(N)개로 줄이는데 성공하였다면, 세그먼트 트리를 이용하여 각 쿼리를 해결할 수 있다.
- 유효한 (a,b) 순서쌍들을 전부 구하여, 각각을 구역 a에 저장한다.
- 쿼리 (l,r)들을 구역 r에 저장한다.
- 구역을 1부터 N까지 차례로 확인한다.
- i번째 구역을 볼 때 세그먼트 트리의 노드 i에 A[i]를 저장한다.
- 저장된 (a,b)에 대하여, 세그먼트 트리의 노드 (2b−a−1)에 A[a]+A[b]를 저장한다.
- 세그먼트 트리의 적절한 구간 연산을 통하여, 각 쿼리의 답을 O(logN)에 구할 수 있다.
라고 장황하게 설명했지만, 간단히 요약하자면 스위핑을 하면서 오프라인 쿼리를 수행하면 된다.
총 시간복잡도는 O((N+Q)logN)이다.
'Problem Solving > Solution Sketch' 카테고리의 다른 글
2020년도 대한민국 국제정보올림피아드 선발고사 풀이 (Day 2) (1) 2023.02.04 2020년도 대한민국 국제정보올림피아드 선발고사 풀이 (Day 1) (5) 2023.02.03 BOJ 16793 Collapse (2) 2023.02.01 BOJ 19933 Comparing Plants (3) 2023.02.01 Baltic Olympiad in Informatics 2022 Day 1 연습 (1) 2023.01.23