
마비노기 모바일에서 악기 연주에 흥미를 느낀 당신은, 실제 악기를 배워보고 싶다는 생각이 들었다. 연습을 위해 당신은 총 개의 음표를 차례대로 연주하려고 한다.
곡의 시작 시각을 이라고 할 때, 번째 음표의 정확한 연주 시각은 이다. 하지만 정확한 연주 시각을 맞출 수 없다면, 대신 구간 안에 연주하면 된다. 다시 말해서, 번째 음표의 실제 연주 시각을 라고 하면, 를 만족해야 한다.
또한, 두 음표의 실제 연주 시각 사이 간격은 이상이여야 한다. 즉, 모든 에 대해, 을 만족해야 한다.
이때, 연주 오차는 번째 음표의 정확한 연주 시각 와 실제 연주한 시각 와의 시각 차이의 합 로 정의된다.
음표마다 정확한 연주 시각과 연주 가능한 구간, 그리고 두 음표의 실제 연주 시각 사이의 최소 간격이 주어지면, 연주 오차를 최소화하면서 연주를 하는 프로그램을 작성하라.
입력 형식
첫 줄에 음표의 개수를 나타내는 정수 과 두 음표의 실제 연주 시각 사이의 최소 간격을 나타내는 정수 가 주어진다. ( )
그다음 개의 줄의 번째 줄에는 번째 음표의 연주 가능한 구간 와 정확한 연주 시각 를 나타내는 세 정수가 , , 의 순서로 공백으로 구분되어 주어진다. ()
출력 형식
조건을 만족하는 연주가 불가능하다면 첫 줄에 을 출력한다.
조건을 만족하는 연주가 가능하다면, 첫 줄에 연주 오차의 최솟값을 출력한다. 그다음 줄에 연주 오차를 최소로 하는 개 음표의 실제 연주 시각 을 공백으로 구분하여 출력한다. 답이 여러 개 존재한다면, 그중 하나만 출력한다.
예제 1
입력
3 1 2 4 6 3 4 6 3 4 6
출력
2 3 4 5
예제 2
입력
3 1 7 8 9 4 5 6 1 2 3
출력
-1
채점 방식
입력 케이스들은 다음과 같은 종류로 구별되며, 한 종류의 케이스를 다 맞혀야 그 종류에 배정된 점수를 받을 수 있다.
종류 1: 8점
종류 2: 15점
종류 3: 46점
종류 4: 31점
모든 입력 케이스가 주어진다.
해설
동적 계획법을 이용해 문제를 해결할 수 있습니다. 편의상 연주 시각의 최댓값을 라고 표기하겠습니다.
이라고 정의합시다.
(단, ) 와 같은 식을 이용해 계산할 수 있고, 주어진 식을 그대로 코드로 옮기면 시간 복잡도는 이 되어 두 번째 부분 문제까지 해결할 수 있습니다.
고정된 에 대해 를 계산할 때 가 증가함에 따라 최솟값을 구해야 하는 구간 이 확장됨을 관찰합시다. 매번 구간의 최솟값을 새로 구하는 대신 추가되는 위치의 값만 반영하면 시간에 정답을 구할 수 있고, 세 번째 부분 문제까지 해결할 수 있습니다.
모든 를 고려하지 않고 만 보더라도 정답을 구할 수 있다는 것을 관찰하면 개의 시점만 확인해도 됨을 알 수 있습니다. 좌표 압축을 이용해 실제로 필요한 시점만 남겨놓은 뒤에 점화식을 계산하면 시간에 문제를 해결할 수 있습니다.