작성
·
287
0
안녕하세요 선생님 수업 열심히 듣고있습니다!
http://boj.kr/44c2eee4e7d84583b105ede311497d38
선생님 코드에서 line 37~47까지 잘 이해가 되지 않아 질문드립니다.
문제를 어떻게 풀어야하는지에 대해서는 이해했습니다. 그래서 left, right로 나누는 것도 이해했고 tree_cnt, tree_sum으로 이전의 나무의 개수, 이전 나무들의 합을 구하는 것도 이해가 됐는데
왜 value++을 하는건가요? 현재 심는 나무의 값을 그대로 사용해야될 것 같은데.. 잘 이해가 안됩니다ㅠㅠ
sum(tree_cnt, 1, value-1)에서 왜 value-1이 들어가는건가요? 제 생각에는 현재 위치까지를 파악해야하니까 i가 들어가야할 것 같은데...(물론 코드를 고쳐서 돌려보니 틀렸습니다) 잘 이해가 되지 않습니다... 비슷하게 다른 sum함수들의 인자에도 왜 max_n이 들어가는지 value + 1이 들어가는지 잘 모르겠습니다...
펜윅트리 너무 어렵네요... 강의 내용 반복해서듣고 외웠는데 정말 쉽지 않은 것 같습니다..ㅠㅠ
설명을 부탁드려도될까요?
답변 1
1
안녕하세요 개발님 ㅎㅎ
for(int i = 1; i <= n; i++){
cin >> value; value++;
if(i != 1){
ll left = value * sum(tree_cnt, 1, value - 1) - sum(tree_sum, 1, value - 1);
ll right = sum(tree_sum, value + 1, max_n) - value * sum(tree_cnt, value + 1, max_n);
ret *= (left + right) % mod;
ret %= mod;
}
update(tree_cnt, value, 1);
update(tree_sum, value, value);
}
왜 value++을 하는건가요? 현재 심는 나무의 값을 그대로 사용해야될 것 같은데.. 잘 이해가 안됩니다ㅠㅠ
>> 아 이거는 문제의 범위때문에 그래요.
문제의 범위를 보면 다음과 같습니다.
각각의 좌표는 200,000보다 작은 자연수 또는 0이다.
0이 들어갈 수 있죠. 근데 tree같은 경우 0번째가 아니라 1번째부터 채워나가야 하기 때문에 ++를 했습니다.
sum(tree_cnt, 1, value-1)에서 왜 value-1이 들어가는건가요? 제 생각에는 현재 위치까지를 파악해야하니까 i가 들어가야할 것 같은데...(물론 코드를 고쳐서 돌려보니 틀렸습니다) 잘 이해가 되지 않습니다... 비슷하게 다른 sum함수들의 인자에도 왜 max_n이 들어가는지 value + 1이 들어가는지 잘 모르겠습니다...
>> left를 잠깐 볼게요. 볼게요. 4번나무의 위치가 4라고 했을 때 그 이전 나무들의 위치들은 4 미만인 4 - 1 이하의 위치를 갖겠죠? 그래서 value - 1입니다.
sum(tree_cnt, 1, value - 1) - sum(tree_sum, 1, value - 1);
sum함수들의 인자에도 왜 max_n이 들어가는지 value + 1이 들어가는지 잘 모르겠습니다...
>>
그림을 그려보면요. 저 빨간색 부분이 -1, +1이 되는 부분이에요.
나무를 심는다고 했을 때
left는 value - 1 ~ 1까지를 의미하구요.
right는 value + 1부터 최대값인 max_n까지를 의미하게 되는 것입니다. 내 오른쪽에 ~ 나무가 몇개야? 이런것을 구하기 위해서 말이죠.
우리가 내 왼쪽에 있는 사람은 내 위치에서 -1인 사람을 의미하잖아요? 그부분을 생각하시면 이해가 쉬우실 것같아요.
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제가 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
선생님 그림까지..! 그림보니까 확 이해가 되네요! 감사합니다