*세그먼트 트리를 사용한다.
*현재 나무의 좌표가 [pos]라고 가정한다.
pos가 나온 시점보다 앞에 심어진 나무 중 pos보다 좌표의 크기가 큰 좌표의 합 = sumUpper
개수 = a
pos가 나온 시점보다 앞에 심어진 나무 중 pos보다 좌표의 크기가 작은 좌표의 합 = sumLower
개수 = b
3 | 2 | 0 | 4 | 1 |
이렇게 다섯 개의 나무가 심어질 것이다.
3의 관점에서 sumUpper = 0/ sumLower = 0 / a = 0 / b = 0 => cost = 0
2의 관점에서 sumUpper = 3 / sumLower = 0 / a = 1 / b = 0 =>
좌표 사이의 거리를 구하는 것이기 때문에 sumUpper - pos*a를 해줘야 한다. (각 좌표에서 기준 좌표를 빼주는 것과 같다)
=> cost = 1
...
4의 관점에서 sumUpper = 9/ sumLower = 0/ a = 3 / b = 1 => 6 + 1 (기준 좌표가 더 큰 값이기 때문에 pos * b - sumLower)
=> cost = 7
*이 문제를 틀리는 가장 큰 이유는 mod를 잘못 나눠줘서 그런 것 같다.
mod를 각 노드의 값을 저장할 때나, 계산할 때 하게 되면 값의 왜곡이 발생한다.
mod = 1,000,000,007 일때 노드의 값이 1,000,000,008이면 1만 저장하게 되는 것이다.
그렇기 때문에 최종값 (total) 을 계산할 때만 mod를 사용한다.
'BOJ > C++' 카테고리의 다른 글
[BOJ] 1600. 말이 되고픈 원숭이 (0) | 2020.04.07 |
---|---|
[BOJ] 9470. Strahler 순서 + TC (0) | 2020.04.01 |
[BOJ] 2636. 치즈 (0) | 2020.03.29 |
[BOJ] 18808. 스티커 붙이기 (0) | 2020.03.25 |
[BOJ] 18809. Gaaaaaaaaaarden (0) | 2020.03.25 |