개념
인접한 값의 차이를 저장하는 배열입니다. , 로 정의하면 차분 배열의 누적 합으로 원래 배열을 복원할 수 있습니다.
구간에 같은 값 더하기
번째부터 번째까지 를 더하려면 에 를 더하고 에서 를 뺍니다. 누적 합을 구할 때 부터 증가량이 적용되고 부터 상쇄됩니다.
모든 원소가 이고 길이가 인 배열에서 에 을 더하면 경계의 차분만 바뀌고, 복원 결과는 입니다.
차분을 다시 더하면 처럼 중간 값이 상쇄됩니다. 이것이 누적 합으로 원래 값을 복원할 수 있는 이유입니다.
구간 전체에 를 더해도 구간 내부의 인접한 두 값의 차이는 로 같습니다. 왼쪽 경계는 앞 원소보다 만큼 더 커지고, 오른쪽 경계 다음은 앞 원소에 비해 만큼 작아지므로 두 경계의 차이만 바뀝니다.
위 예의 차분은 입니다. 왼쪽부터 더하면 이 되어 구간에만 이 적용됩니다. 마지막 원소까지 갱신한다면 오른쪽 경계 다음 칸은 배열 바깥의 종료 표시로 생각할 수 있습니다.
이 방법은 여러 구간에 값을 더한 뒤 최종 배열을 한 번 구하는 문제에 적합합니다. 매 갱신 직후의 구간 합까지 필요하다면 복원 비용이 반복되므로 세그먼트 트리처럼 원소 수정과 구간 합 계산을 함께 처리하는 방법을 사용합니다.
복잡도
모든 갱신이 끝난 배열이 필요한 경우에 적합합니다. 원소 수를 , 갱신 수를 라고 합니다.
| 연산 | 시간복잡도 | 공간복잡도 |
|---|---|---|
| 구간 갱신 기록 | 추가 | |
| 최종 배열 복원 | 차이 배열 | |
| 전체 갱신과 복원 | 차이 배열 |
예제
문제
처음에 모든 원소가 인 배열에 구간 덧셈을 수행한 뒤 최종 배열을 구하여라.
입력
첫째 줄에 배열 길이 과 연산 수 가 공백을 사이에 두고 주어진다. 이다.
다음 개 줄에 구간의 양 끝 번호 과 더할 값 가 공백을 사이에 두고 주어진다. ; 이다. 번호가 부터 까지인 모든 원소에 를 더한다.
출력
최종 배열의 원소를 번호 순서대로 한 줄에 공백을 사이에 두고 출력한다.