퀵정렬

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

요약
서로 겹치지 않는 인접한 쌍들을 한 단계에서 여러 개 바꿀 수 있을 때, 배열을 n단계 이내로 정렬하는 방법을 출력한다.
난이도

보통10점 중 6점

유형
정렬, 그리디, 배열, 구현
정답자
아직 제출이 없습니다

문제

한 줄로 놓인 카드에 수 a1, a2, ..., an이 적혀 있다. 이 배열을 비내림차순으로 정렬해야 한다. 카드가 꽤 커서 한 사람은 인접한 두 카드만 바꿀 수 있다. 하지만 카드 하나를 동시에 두 사람이 바꾸지만 않으면, 사람은 얼마든지 많이 쓸 수 있다. 그래서 한 단계에서 서로 겹치지 않는 인접한 카드 쌍들을 임의로 골라 동시에 바꿀 수 있다.

더 정확히 말하면, 한 단계에서 i1 + 2 ≤ i2, i2 + 2 ≤ i3, ..., ik−1 + 2 ≤ ik를 만족하는 인덱스 i1, i2, ..., ik를 고르고 ai1과 ai1+1, ai2와 ai2+1, ..., aik과 aik+1을 바꿀 수 있다.

목표는 주어진 배열을 n단계 이내에 비내림차순으로 정렬하는 것이다. 단계 수를 최소로 만들 필요는 없다.

입력

입력에는 여러 테스트 케이스가 들어 있다. 첫 줄에 테스트 케이스의 수 t가 주어진다. 각 테스트 케이스는 두 줄로 설명된다. 첫째 줄에는 배열의 크기 n이 주어지고, 1 ≤ n ≤ 100이다. 둘째 줄에는 배열의 원소 a1, a2, ..., an이 주어진다. 배열의 원소는 1 이상 109 이하의 정수다.

입력에 주어지는 n 값의 합은 1000을 넘지 않는다.

출력

모든 테스트 케이스의 답을 순서대로 출력한다. 각 테스트 케이스마다 배열을 정렬하는 데 쓴 단계 수 m(0 ≤ m ≤ n)을 한 줄에 출력한다. 다음 m개 줄에는 각 단계를 설명한다. 바꾸는 쌍의 수 k(0 ≤ k ≤ ⌊n/2⌋)와 각 쌍의 첫 번째 원소의 인덱스 i1, i2, ..., ik를 증가하는 순서로 출력한다.

예제1

  1. 예제 1

    입력
    2
    3
    3 2 1
    4
    300 200 400 100
    
    예상 출력
    3
    1 1
    1 2
    1 1
    3
    2 1 3
    1 2
    1 1