나쁜 순서

시간 제한2초메모리 제한512 MB

요약
1부터 n까지의 순열 일부가 0으로 비어 있을 때, 최솟값부터 제자리를 찾아 바꾸는 방식의 정렬이 최대 횟수의 교환을 하도록 0을 채우고 그 횟수와 배열을 출력한다.
난이도

보통10점 중 7점

유형
그리디, 수학, 조합론, 구현
정답자
아직 제출이 없습니다

문제

Little Dima의 방 바닥에는 예쁜 무늬가 있는데, 이는 일렬로 놓인 n개의 점으로 이루어져 있다. 우연히도 Dima는 좋아하는 장난감 정육면체 n개를 가지고 있고, 그 무게는 각각 1, 2, ..., n 그램이다. Dima는 정육면체를 가지고 노는 것을 끝내고 바닥의 점 위에 정육면체를 하나씩 놓았다. 이제 그는 무게가 왼쪽에서 오른쪽으로 증가하도록 정육면체를 재배치하려고 한다. 그러나 그는 그러기 전에 잠시 쉬었고, 그 사이에 나쁜 소년 Vadim이 방에 들어왔다.

Vadim은 Dima가 다음 방법으로 정육면체를 재배치할 것을 알고 있다. 매번 그는 아직 잘못된 점에 있는 가장 작은 무게의 정육면체를 찾아, 그 점을 차지하고 있는 정육면체와 교환한다.

Vadim은 매우 악의적이어서 Dima가 최대한 많은 교환을 하도록 강제하려고 한다. 그는 Dima의 줄에서 정육면체 몇 개를 빼냈고, 이제 그것들을 다시 놓을 계획이다. 그는 각 점에 정확히 하나의 정육면체가 있도록, 이전에 빼가지 않은 정육면체는 원래 자리에 그대로 있도록, 그리고 Dima가 자신의 방법으로 정육면체를 정렬하기 위해 가능한 최대 횟수의 교환을 해야 하도록 다시 놓으려고 한다.

Vadim은 정육면체를 줄에 어떻게 다시 놓아야 하는가?

입력

입력 데이터는 여러 테스트 케이스로 이루어져 있다. 입력의 첫 줄에는 테스트 케이스의 수 t가 주어진다.

각 테스트는 다음과 같이 설명된다.

설명의 첫 줄에는 정수 n이 주어진다. 이는 정육면체의 수이다. (1 ≤ n ≤ 105) 다음 줄에는 n개의 정수 ai가 주어진다. (0 ≤ ai ≤ n)

ai가 0이면 i번째 점의 정육면체가 Vadim에 의해 빼앗겼다는 뜻이며, 이 점은 이제 비어 있다. 그렇지 않은 경우 ai는 i번째 점에 있는 정육면체의 무게이다.

남아 있는 모든 정육면체의 무게는 서로 다르며, Vadim은 현재 줄에 없는 정육면체를 정확히 되돌려 놓아야 한다.

한 입력 데이터의 모든 테스트 케이스에서 n의 합은 105을 넘지 않는다.

출력

각 테스트 케이스마다 두 줄을 출력한다.

첫 번째 줄에는 Vadim이 Dima에게 강제할 수 있는 최대 교환 횟수를 출력한다.

두 번째 줄에는 Vadim이 빼간 정육면체를 되돌려 놓은 후 정육면체가 배열된 순서대로의 무게 n개를 출력한다. 빼가지 않은 정육면체는 현재 위치에 그대로 있어야 한다.

Dima가 최대 횟수의 교환을 하도록 하는 배열이 여러 개라면, 그 중 아무 것이나 출력한다.

예제1

  1. 예제 1

    입력
    3
    2
    0 0
    4
    4 0 0 3
    5
    0 4 0 2 5
    
    예상 출력
    1
    2 1
    3
    4 1 2 3
    2
    3 4 1 2 5