레이지 세그를 공부하던 중 만난 문제다..
그냥 딱 보면 이게 뭐지 싶은 발상이 쉽지 않았다.
문제에는 2가지 쿼리가 주어진다.
- 1 l r : $\sum_{i=l}^{r}A_i+i-l+1$ 을 한다.
- 2 x : $A_i$ 의 값을 출력한다.
문제에서 1번 쿼리를 하면 $\sum_{i=l}^{r}A_i+i-l+1$을 하기 때문에 일반적인 구간 합 구하기 방법으로는 찾기 힘들다. 그렇다면 어떤 방법을 사용해야 될까에 대해 고민해 봐야 되는데 여기서 누적합을 응용하면 문제가 단순하게 변한다.
여기 예제 1번을 보자
1 2 1 2 1
여기서 누적합은 앞에 저장된 수를 더하지만 이번엔 앞에 수로 빼보자
1 1 -1 1 -1
이 상태에서 누적합을 하면 다시 처음 상태로 복원되는 것을 확인할 수 있다.
그럼 이걸 가지고 무엇을 할 수 있을까?
구간에 출입을 기록할 수 있다.
에..?
뭔소린가 싶다.
여기서 출입은 l, r구간에 v를 더한다고 가정하면 l번째 수에 +v를 하고 r+1번째에 -v를 하는 것이다.
그러면 이러한 쿼리를 전부 실행한 후 배열을 다시 복원하면 원하는 수를 구할 수 있다!
하지만 이 문제의 쿼리는 증가하는 형태로 더해진다.
그렇다면 각 i에 1씩 더하고 r+1에 r-l+1을 빼주면 된다!
1번 쿼리를 해결했으니 2번 쿼리는 쉽다.
누적합을 사용하면 배열이 복구가 됨을 이용해 1~x까지의 구간합이 찾고자 하는 $A_x$와 같다.
'PS & BOJ' 카테고리의 다른 글
BOJ 17971 - Ladder Game (0) | 2023.11.12 |
---|---|
BOJ 11000 - 강의실 배정 (0) | 2023.11.10 |
BOJ 7888 - Two professors (0) | 2023.11.08 |
BOJ 10975 - 데크 소트 2 (0) | 2023.11.07 |
BOJ 29792 - 규칙적인 보스돌이 (1) | 2023.11.01 |