sanha93   3년 전

getFruit -> 구간 곱 구하는 함수 

changeTree -> 값 변경하는 함수

makeTree -> 세그먼트 트리만드는 함수

입니다. changeTree는 리프부터 출발해서 올라가도록 만들었습니다. 

0 이곳저곳에 넣어보기도 하고

changeTree 가 잘 작동하는지도 여러번 확인했고


트리에 1개, 2개 들어갈때도 확인을 해봤는데 못찾겠어요 ㅠㅠ


convert7342   3년 전

tree 와 q와 save의 자료형 문제로 보입니다.

구간곱을 저장하다보면 int 자료형의 범위를 넘어갈 것으로 보이네요

sanha93   3년 전

1000000007 로 나눈 나머지면 무조건 100000007 보다 작지 않을까요?  long long 으로 계산한 후에 모드 계산으로 int 커버 할 만큼 줄인 다음에 int로 넘기는 식이라.. 이렇게하면 문제가 발생할까요?

convert7342   3년 전

tree의 자료형만 문제가있네요.

temp = (tree[p] * tree[fr])DEVIDE;

이런부분들을 보면 tree[p]와 tree[fr] 같은 것들은 100000007로 나눈 나머지가 저장되니 100000006이 저장되어 있다고 칩시다.

그러면 tree[p] * tree[fr]이 연산되는 과정에서 int범위를 초과하기 때문에 오버플로우가 발생합니다.

이미 연산되는과정에서 오버플로우가 발생했기때문에 연산 후에 DEVIDE를 해주더라도 오답이 발생하구요

sanha93   3년 전

아... 나중에 트리 바꿔줄때 그부분에서 실수한거였군요 ㅠㅠ 감사합니다.. 

changeTree의 

temp = (tree[p] * tree[fr])DEVIDE;

해당 부분만 

temp = ((long long)tree[p] * (long long)tree[fr])DEVIDE; 

이렇게 바꿔주니 통과가 나오네요. 감사합니다 ㅠㅠ

댓글을 작성하려면 로그인해야 합니다.