입력부분을 바꾸니 맞네요
저도 정확히 기억하고 있는 건 아닌데 cin.eof()가 예상대로 동작을 안하나 봅니다. 아래 코드처럼 바꿔주시면 동작합니다. cin이 아마 입력을 받으면 1을 리턴해주고 아니라면 0을 리턴해주는 것으로 어디서 들어서 이게 잘 동작합니다.
5676번 - 음주 코딩
입력부분을 바꾸니 맞네요
저도 정확히 기억하고 있는 건 아닌데 cin.eof()가 예상대로 동작을 안하나 봅니다. 아래 코드처럼 바꿔주시면 동작합니다. cin이 아마 입력을 받으면 1을 리턴해주고 아니라면 0을 리턴해주는 것으로 어디서 들어서 이게 잘 동작합니다.
답변 감사드립니다. eof 함수 한번 확인해봐야겠네요.
댓글을 작성하려면 로그인해야 합니다.
euphoric_n 2년 전
아무리 살펴봐도 잘못된 부분을 찾을 수 없어 질문드리게 되었습니다
부호만 구하면 되기 때문에 모든 음수는 -1, 양수는 1로 바꿔서 세그먼트 트리에 저장합니다.
예를들어 n=4일 때 값들은 아래 그림과 같이 tree[4] ~ tree[7]에 저장됩니다.
아래 그림에서 tree[1]은 tree[2] * tree[3]의 값을 가지고,
tree[2] 는 tree[4] * tree[5], tree[3] 은 tree[6] * tree[7]의 값을 가지므로 tree[1]은 모든 원소의 곱을 가지고 있습니다.
tree[1]
tree[2] tree[3]
tree[4] tree[5] tree[6] tree[7]
init 함수
세그먼트 트리 초기화시 start = 0, end = n-1, node = 1 값을 인자로 하여 init 함수를 호출합니다.
start와 end는 초기화하고자 하는 arr 인덱스, node는 tree에서의 인덱스입니다.
start와 end가 같아지면 해당 노드에 arr 배열의 값을 저장하면서 해당 값을 반환, (tree[node] = arr[start])
그렇지 않다면 왼쪽과 오른쪽으로 나눠 초기화 하면서 양쪽의 값을 곱해서 현재 위치에 저장합니다.
update 함수
start, end, node, index, dif를 인자로 가집니다.
index는 업데이트하고자 하는 수의 arr 인덱스입니다. (i번째 수라면 i-1)
dif는 덮어쓰고자 하는 값입니다.
index가 [start, end] 범위내에 있지 않다면 단순히 해당 위치의 tree[node] 값을 반환합니다. (업데이트 시 필요)
start == end == index라면 해당 노드에 dif 값을 저장하고 반환합니다. ( return tree[node] = dif )
그렇지 않다면 왼쪽과 오른쪽으로 나눠 업데이트하면서 현재 노드의 값도 업데이트합니다.
answer 함수
[left, right] 범위의 곱을 구하려 합니다.
해당 범위가 [start, end]와 겹치지 않는다면 1을 반환합니다. (곱셈의 항등원)
만약 해당 범위가 [start, end]를 완전히 포함한다면 현재 노드의 값을 반환합니다.
그렇지 않다면 [start, mid], [mid+1, end]로 나누어 양쪽 노드의 값을 곱한 값을 반환합니다.
문제 예제 입출력과 출처인 대회 입출력 데이터는 통과했습니다. 제출시에는 50%에서 WA를 받습니다.