ページが読み込まれませんか? こちらをクリックすると直るかもしれません。
Placeholder

#10404
インタラクティブ
採点保留

최소 정렬 60s 1024MB

問題

이 문제에서는 서로 다른 정수 \mathbf{N} = 100개로 이루어진 리스트를 엄격히 증가하는 순서로 정렬해야 한다. 당신은 (서로 인접할 필요 없이) 임의의 두 위치에 있는 값을 서로 맞바꾸는 swap 연산으로 리스트를 재배열할 수 있다. 하지만 각 위치의 값을 직접 읽을 수는 없다. 대신, 연속한 구간에 대한 "최솟값 질의"를 통해 리스트에 대한 정보를 얻을 수 있다. 최솟값 질의는 연속 구간에서 최솟값을 가지는 원소의 위치를 반환한다. 예를 들어 리스트가 [51, 33, 100, 11]이라면, (1부터 세는) 2번부터 4번 위치까지의 최솟값은 4번 위치에 있고, 1번부터 3번 위치까지의 최솟값은 2번 위치에 있다.

구간의 최솟값을 묻는 질의는 테스트 케이스마다 주어지는 코인 예산에 의해 제한된다. 구간이 길수록 더 싸다. 즉, i \lt j일 때 i번부터 j번 위치까지(양 끝 포함) 최솟값의 위치를 묻는 데 드는 비용은 \lceil 10^8 / (j - i + 1) \rceil 코인이다. 여기서 \lceil x \rceilx 이상인 최소의 정수(즉 올림)이다. 반면 swap 연산은 코인을 전혀 소모하지 않는다.

각 테스트 케이스마다, 임의의 횟수의 swap과 최댓값이 6 \times 10^8 코인인 예산 안에서(임의의 횟수의) 최솟값 질의를 사용하여 리스트를 정렬하는 프로그램을 작성하라.


出典

GCJ 2021r2 A

ログインしないとコードを書けません。