해설
번 나라에 도착했을 때 가지고 있는 금화를 라고 하자.
번 나라를 방문하려면 여야 하며, 방문한 뒤 가지고 있는 금화는 방문 전의 금액과 관계없이 정확히 가 된다.
따라서 지금까지 방문한 나라의 구체적인 목록은 중요하지 않다. 현재 가지고 있는 금화가 같다면, 그중 방문한 나라의 수가 가장 많은 상태만 남기면 된다.
DP 정의
앞에서부터 나라를 처리하면서, 다음 값을 관리한다.
처음에는 아무 나라도 방문하지 않았으므로 다음과 같이 초기화한다.
도달할 수 없는 상태의 값은 로 둔다.
번 나라를 방문할 수 있는 이전 상태에서는 현재 금화가 이상이어야 한다. 따라서
를 구한다.
이 가 아니라면, 해당 상태에서 번 나라를 방문할 수 있다. 방문 후 금화는 개가 되므로 다음과 같이 갱신한다.
번 나라를 방문하지 않는 경우에는 기존 상태가 그대로 유지되므로 별도의 갱신이 필요하지 않다.
관리해야 하는 금화의 종류
처음에는 금화가 개이고, 나라를 한 번 이상 방문했다면 현재 금화는 마지막으로 방문한 나라의 와 같다. 따라서 등장할 수 있는 금화의 값은
뿐이다.
이 값들을 정렬한 뒤 중복을 제거하여 좌표 압축한다.
각 나라를 처리할 때는 이분 탐색으로 이상인 첫 번째 압축 좌표를 찾고, 그 위치부터 끝까지의 의 최댓값을 구한다. 구간 최댓값 질의와 한 점 최댓값 갱신은 세그먼트 트리로 각각 에 처리할 수 있다.
정당성 증명
첫 개의 나라를 처리한 뒤, 각 금화 에 대하여 가 현재 금화가 인 모든 가능한 상태 중 방문 횟수의 최댓값이라고 가정하자.
번 나라를 방문하지 않는 모든 상태는 이전 상태와 금화와 방문 횟수가 모두 같으므로 기존의 에 그대로 남는다.
번 나라를 방문하는 상태를 생각하자. 방문 직전의 금화를 라 하면 반드시
이어야 한다. 이러한 모든 이전 상태 중 방문 횟수의 최댓값은 구간 최댓값으로 구한 이다. 나라를 방문하면 방문 횟수는 하나 증가하고 금화는 정확히 개가 되므로, 이 경우의 최적값은 이다.
따라서
로 갱신하면 번 나라를 방문하는 모든 경우와 방문하지 않는 모든 경우를 정확히 고려한다.
초기 상태 도 올바르므로, 수학적 귀납법에 따라 모든 나라를 처리한 뒤의 DP는 정확하다. 모든 중 최댓값이 정답이다.
복잡도
각 나라에서 이분 탐색, 구간 최댓값 질의, 한 점 갱신을 각각 한 번씩 수행한다.
따라서 시간 복잡도는 이고, 공간 복잡도는 이다.
Solution written by GPT5.5