문제 링크
- http://icpc.me/13546
사용 알고리즘
- 모스 알고리즘
- 평방 분할
풀이
수열 A의 값은 모두 1 이상 k이하입니다.
모스 알고리즘을 돌리면서 값이 K인 인덱스를 K개의 deque(혹은 list)로 관리해주고, deque를 monotone하게 유지해주면서 문제를 풉니다.
deque를 monotone하게 유지해준다면, 각 숫자마다 |x-y|의 max는 |back - front|로 쉽게 구할 수 있습니다.
그러나 모든 K개의 덱 중에서 |back - front|의 최댓값을 구할 방법은 쉽게 떠오르지 않습니다.
K개의 덱에서 뽑아낸 |back - front|의 값들에 대해서 sqrt decomposition을 해줄겁니다.
덱에 삽입/삭제 연산을 하면 |back - front|의 값이 변하게 됩니다. 기존 |back - front|를 prv, 삽입/삭제 연산으로 인해 새로 바뀐 |back - front|를 now라고 합시다.
prv가 등장한 횟수가 1 감소하고, now가 등장한 횟수가 1 증가합니다.
등장할 수 있는 횟수는 0~N이므로, 0~N을 sqrt(N)개의 버킷으로 분할했다면, prv/now의 등장횟수가 1씩 변하는 것은 단순한 update이기 때문에 O(1)만에 할 수 있습니다.
최댓값을 구하는 것은 제일 뒤에있는 버킷부터 하나씩 보면서, 0보다 큰 값이 있는 버킷 하나만 뒤져보면 sqrt(N)만에 구할 수 있습니다.
전체 코드
1 |
|