문제 링크
- http://icpc.me/17410
사용 알고리즘
- sqrt Decomposition
시간복잡도
- O(Q √N logN)
풀이
업데이트 쿼리가 주어지지 않는다면 merge sort tree등의 자료구조로 해결 가능하지만, 이 문제는 업데이트 쿼리가 주어집니다.
수열을 sqrtN개씩 덩어리(버킷)로 나눈 다음에, merge sort tree처럼 각 덩어리를 정렬해봅시다.
이렇게 하면 k보다 큰 원소들의 개수를 sqrtN개의 버킷에 upper_bound를 날려서 O(√N logN) 만에 할 수 있습니다.
각 버킷들은 이미 정렬이 되어있는 상태입니다. 현재 A[i] = x인데, A[i]의 값을 y로 바꾼다고 합니다.
A[i]가 속하는 버킷에서 naive하게 x를 찾아서 지워주고, 적당한 위치에 y를 삽입해주면 됩니다.
vector에서 erase와 insert를 써도 버킷의 크기는 sqrtN이기 때문에 O(√N)에 업데이트 쿼리를 처리할 수 있습니다.
전체 코드
1 |
|