gkfkagkfka12   6년 전

고수분들...제발 살려주십쇼 6시간을 넘게 한 문제만 붙들고 있네요...

질문들도 다 보고 구글링도 계속했는데 세그먼트 트리로 풀려면 제 풀이는 다음과 같습니다.

1. 배열을 정렬기준으로 세그먼트 트리를 만든다.

2. 임의의 X를 기준으로 X보다 작은 숫자의 개수가 K보다 작거나 같음/더 큼 기준으로 이진탐색을 하면 마지막 X가 답이 된다.

근데 여기서 2번을 어떻게 구현해야 하는지 모르겠습니다. 임의의 X를 어떤 것으로 잡아야 할지랑 이진탐색을 세그먼트 트리 위에서부터 재귀적으로 아래로 내려오면서 하는지를 잘 모르겠습니다. 도움주시면 감사하겠습니다.

코드는 2번이 구현되지 않은 상태입니다.

atomzeno   6년 전

예제를 가지고 보면

1 5 2 6 3 7 4 를 쪼개서

대충 생각난 거론

1층: 1 2 3 4 5 6 7

2층: 1 2 5 3/ 4 6 7

3층: 1 5/2 3/ 6/4 7

4층: 1/5/2/6/3/7/4

이렇게 쪼개시고 하시면 됩니다.... 2 5 3을 예로 들면

(2,5)=(2,2)+(3,4)+(5,5)이니 임의의 수 i에 대해

1.각 부분에서 i이하의 수의 개수 세기(각 구간은 정렬되 있으므로 이진탐색)

2. i가 각 부분에 나오는지(이진탐색하면서 알 수 있음)

를 log(n)2만에 알 수 있으므로, O(Q*log(n)2+n*log(n))만에 해결될 것으로? 보입니당

gkfkagkfka12   6년 전

그 임의의 수 i를 어떤기준으로 잡아야 되죠?

atomzeno   6년 전

1~N사이에서 이진탐색하는 거로?

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