akane   5년 전

각 노드에는 하위 리프노드들의 범위와 개수가 저장돼있구요

한쪽으로 쏠려서 O(n)연산하는 경우를 방지 하려고 

insert 할 때마다 한쪽으로 치우침을 확인해서 다른쪽으로 insert 하는 식으로 처리했어요

추가할 때마다 O(lg n), query를 계산할 때마다 O(lg n) 이니 n lg n이고

메모리는 노드당 20byte가 최대 400만개니까 제한 범위 이내라고 생각하는데..

어떻게 풀어야 하나요??

yukariko   5년 전

구현을 정확하게 이해하지 못했지만

query는 왼쪽, 오른쪽을 다 탐색하기 때문에 최악에 O(n)이 아닌가요?

이 문제는 미리 만들어져있는 세그먼트 트리에서 각 리프노드의 가중치를 0, 1로 두면 sum - 세그먼트 트리를 통해 해결할 수 있습니다.

yukariko   5년 전

insert는 치우쳐질때마다 이동을 시키는데, 이동의 시간복잡도도 O(lgN)으로 보입니다.

계속 치우쳐지면 O(lg^2N)이 될것같습니다.

kks227   5년 전

기본적인 세그먼트 트리를 가지고도 풀 수 있습니다.

이 문제의 키포인트는 세그먼트 트리를 변형시키는 것이 아니고, 광활한 범위의 값들을 어떻게 처리하는가 입니다.

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