본문 바로가기

BOJ/C++

[BOJ] 1280. 나무심기

*세그먼트 트리를 사용한다. 

*현재 나무의 좌표가 [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