정수 N 개로 이루어진 수열 A1,A2,⋯,AN과,
정수 N−1 개로 이루어진 수열 X1,X2,⋯,XN−1이 있다.
1 이상 N−1 이하의 모든 i에 대해
Ai+1−Ai=Xi가 되도록
수열 A의 값을 수정하려고 한다.
연산 한 번으로 수열 A의 값 하나를 1만큼 증가하거나 감소할 수 있다.
목표를 달성하는 최소 연산 횟수를 계산하는 프로그램을 작성하라.
입력 형식
첫 줄에 정수 N이 주어진다.
(3≤N≤300000)
두 번째 줄에 수열 A의 값을 나타내는
N 개의 정수 A1,A2,⋯,AN이
공백으로 구분되어 주어진다.
세 번째 줄에 수열 X의 값을 나타내는
N−1 개의 정수 X1,X2,⋯,XN−1이
공백으로 구분되어 주어진다.
주어지는 수열의 값은 모두 −1000000보다 작지 않으며,
1000000보다 크지 않다.
출력 형식
첫 줄에 주어진 조건을 만족하기 위해 필요한
최소 연산 횟수를 출력한다.
예제
입력
3
2 3 6
2 1
출력
2
채점 방식
입력 케이스들은 다음과 같은 종류로 구별되며, 한 종류의 케이스를 다 맞혀야 그 종류에 배정된 점수를 받을 수 있다.
종류 1: 5점
N=3; 수열 X의 값은 모두 1이다.
종류 2: 16점
N≤100; 수열 A와 수열 X의 값은 모두 절댓값이 100을 넘지 않는다.
종류 3: 32점
N≤5000
종류 4: 28점
수열 X의 값은 모두 1이다.
종류 5: 19점
추가적인 제한 조건이 없음.
해설
설명의 편의를 위해 모든 i≥2인 i에 대해 Ai−Ai−1=Xi가 되도록 수열 A의 값을 수정하는 문제로 바꾸자.
X 배열의 누적 합 배열 Si=X1+X2+⋯+Xi를 생각해 보면, Ai=A1+Si가 되도록 만들어야 함을 알 수 있다. 따라서 i=1∑N∣A1+Si−Ai∣가 최소가 되도록 A1을 수정하는 문제라고 생각할 수 있다. Vi=Ai−Si라고 정의하면, i=1∑N∣A1−Vi∣를 최소화하는 문제가 된다.
이러한 형태의 식은 A1이 V의 중앙값일 때 최소가 되므로 정렬 알고리즘을 이용하면 O(NlgN), 선택 알고리즘을 이용하면 O(N)의 시간복잡도로 문제를 해결할 수 있다.