[1. 문제 설명]
길이가 N 인 수열이 있을 때, 아래 쿼리를 수행하는 프로그램을 작성
- 구간 [i, j] 내 모든 값에 K 를 더한다.
- A[x] 를 출력한다.
[2. 풀이 접근]
update 횟수가 최대 N 번이고
그 때마다 각 구간의 길이는 최대 N 일 수 있으므로,
단순하게 푼다면 N3
구간트리에서 단일 index 만 업데이트 한다면 N2logN 이 걸린다.
이 문제를 푸는 방법에는
Lazy Propagation, 팬윅트리(구간 트리의 다른 버전) 등이 있다고 하는데
위 방법을 사용하지 않고 풀 수 있다.
최초 구간트리 초기화 시,
구간 트리의 단말노드에만 값을 부여하고,
단말이 아닌 노드는 0을 초기화 한다.
# 아래 그림에서 구간의 길이가 1인 곳에만 배열에 설정 된 값을 부여하는 것이다.
일반적인 구간 트리의 연산에는
크게 update 와 query 가 있으며,
update 는 단일 index 에 대해서만 업데이트 하며,
query 는 구간에 대한 쿼리를 말하는데,
여기서는 반대로 생각해야 한다.
update 를 구간에 대해서 하고
query 를 단일 index 에 대해서만 해야 한다.
각 단말 노드가 index 와 같은 값으로 설정되어있다 생각하고,
구간 1~3 의 모든 원소에 4 를 더하는 연산을 진행하면 아래와 같은 형태가 된다.
이번에는 구간 3~4 의 모든 원소에 2를 더하는 연산을 진행하면 아래와 같이 된다.
구간을 완전히 포함했을 때, 해당 구간에 누적 된 값을 갱신하는 것이다.
이제 index 2 가 가리키는 값을 확인하면 아래와 같이 탐색을 해야 한다.
루트에서 2를 만날 때 까지 마주친 노드에 설정 된 값은
각각 4와 2 이다.
이 두 값을 더해주면 update 가 진행 된 후 A2 에 설정 된 값을 알게 된다.
[3. 코드]
'알고리즘 > Baekjoon' 카테고리의 다른 글
구간 트리. [1168] (0) | 2022.11.03 |
---|---|
구간 트리. [12899] (0) | 2022.11.02 |
구간 트리. [9345] (0) | 2022.10.31 |
구간 트리. [1517] (0) | 2022.10.30 |
구간 트리. [2357] (0) | 2022.10.29 |