Lazy propagation 안쓰고 구간 업데이트 쿼리 처리하기

일반적인 구간 업데이트 쿼리 처리 문제는 Lazy propagation을 구현한 세그먼트 트리로 풀 수 있다. 

좀 더 특수한 경우의 문제로 먼저 구간 업데이트 쿼리가 쭈~욱 주어지고, 업데이트 쿼리의 중간에는 다른 쿼리를 처리할 필요가 없는 문제를 생각할 수 있다.

이런 경우의 문제는 구간 업데이트 쿼리를 각각 O(1)에 처리할 수 있다.

길이 N인 배열 A가 주어졌다고 하자. 편의상 인덱스를 1 \sim N으로 쓰고 A[0]에는 0이 들어있다고 생각하자. 그리고 다른 배열을 정의하겠다.

S[i] : 구간 업데이트 쿼리에 의해 A[l, \infty]에 일정하게 더해진 값
P[i] : A[0] ~ A[i]의 구간합

만약 S를 알고 있다고 하면
P[0] = 0
P[i] = P[i - 1] + S[i] + A[i]
가 된다.

S는 구간 쿼리가 구간 [l, r]x를 일정하게 더해라는 식으로 들어오면
S[l]x를 더하고 S[r + 1]x를 빼서 처리할 수 있다.

설명하려고 SP를 따로 썼지만 실제 구현에서는 하나의 배열로 처리해도 무방하다. 
--------------------------------------------------------------

댓글

이 블로그의 인기 게시물

repeated squaring

인덱스트리(Indexed Tree)