https://www.acmicpc.net/problem/3653

Baekjoon Online JudgeBaekjoon Online Judgewww.acmicpc.net

초기 세팅:

 

DVD에 대하여 해당 DVD가 쌓여지는 순서를 map에 저장

 

예를 들어, n = 100000일 때, 100000DVD는 젤 처음으로 쌓이고, 1DVD는 맨 마지막(100000번째), 2DVD99999번째로 쌓이기 때문에

map[100000] = 1, map[1] = 100000, map[2] = 99999

 

따라서, 초기 세팅 이후에 처음으로 iDVD가 뽑힌다면, map[i] = 100001이 되고, 그 다음으로 jDVD가 뽑힌다면, map[j] = 100002가 됨.

 

이런 식으로 update을 해주다보면, 임의의 DVD 배열 상태에서 map[DVD]value는 내림차순이 됨(배열을 위에서부터 아래로 훑을 때). update마다 가장 최근에 뽑힌 DVD가 배열 상에서 가장 위로 올라가고, map[가장최근DVD번호]가 직전 배열에서 가장 큰 value+ 1이기 때문. , mapvalue들은 정렬된 상태를 유지.

 

풀이:

 

DVD들을 map[DVD]value에 따라 C++set같은 이진탐색트리에 저장한다면, iDVD를 뽑아서 맨위로 올릴 때

1. map[i]value를 이진탐색트리에서 찾는다 log(n)

2. map[i]보다 큰 value들의 개수를 구한다 log(n)

3. value들은 오름차순을 유지하기 때문에 map[i]보다 큰 value들의 개수가 iDVD를 뽑을 때 iDVD위에 있는 DVD들의 개수.

 

이런 식으로 풀면 mlog(n)에 풀이가 가능하지 않나?