배열 정렬하기 (스몰)

순열을 K개의 연속 구간으로 나눠 각각 정렬한 뒤, 최대 두 구간을 서로 바꿔 전체를 정렬할 수 있을 때 가능한 가장 큰 K를 구한다.

보통7배열정렬그리디동적 계획법아직 제출이 없습니다시간 제한5초메모리 제한512 MB

문제

1부터 NN까지의 정수가 한 번씩 들어 있는 배열 AA를 정렬하는, 조금 색다른 알고리즘을 만들고 있다. AA의 원소는 처음에 임의의 순서로 놓여 있다. 이 알고리즘은 입력 순서 말고도 두 정수 PPKK에 따라 달라진다. PP는 3 이하이다. 동작 방식은 다음과 같다.

  1. AA를 비어 있지 않은 KK개의 부분 배열 A1,A2,,AKA_1, A_2, \dots, A_K로 나눈다. 이때 A1A2AKA_1 A_2 \dots A_K를 순서대로 이어 붙이면 다시 AA가 되어야 한다.
  2. 각 부분 배열을 따로 정렬한다.
  3. 부분 배열 중 최대 PP개를 고르고, 고른 것 중 두 개의 자리를 맞바꾸는 일을 원하는 횟수만큼 한다.

예를 들어 A=[1 5 4 3 2]A = [1\ 5\ 4\ 3\ 2]이고 P=2P = 2라고 하자. K=4K = 4로 나누는 한 가지 방법은 다음과 같다.

A1 = [1]
A2 = [5]
A3 = [4]
A4 = [3 2]

각 부분 배열을 정렬한 뒤

A1 = [1]
A2 = [5]
A3 = [4]
A4 = [2 3]

A4와 A2의 자리를 맞바꾼 뒤

A1 = [1]
A2 = [2 3]
A3 = [4]
A4 = [5]

이 알고리즘이 분산 환경에 잘 맞는다는 것을 보이려고 한다. 입력과 PP가 고정되었을 때, 분할과 교환을 잘 골라서 원래 배열을 정렬할 수 있는 KK의 최댓값을 구하라.

입력

첫 줄에 테스트 케이스의 개수 TT가 주어진다.

이어서 TT개의 테스트 케이스가 주어진다. 각 테스트 케이스는 두 줄이다. 첫 줄에는 위에서 설명한 두 정수 NNPP가 주어진다. 둘째 줄에는 배열 AA를 나타내는 NN개의 정수 X1,X2,,XNX_1, X_2, \dots, X_N이 주어진다.

출력

각 테스트 케이스마다 Case #x: y 형식으로 한 줄씩 출력한다. xx는 1부터 시작하는 테스트 케이스 번호이고, yyKK가 가질 수 있는 최댓값이다.

제한

  • 1T1001 \le T \le 100
  • 1N50001 \le N \le 5000
  • 모든 ii에 대해 1XiN1 \le X_i \le N
  • iji \ne j이면 XiXjX_i \ne X_j
  • P=2P = 2

힌트

예제 입력의 첫 번째 테스트 케이스는 문제에서 설명한 과정과 같다.

두 번째 테스트 케이스는 다음과 같이 나눈다.

[4 5] [1 2 3]
두 부분 배열의 자리를 맞바꾸면: [1 2 3] [4 5]

세 번째 테스트 케이스는 다음과 같이 나눈다.

[6] [3 5 2 4] [1]
[3 5 2 4]를 정렬한 뒤 [6]과 [1]의 자리를 맞바꾸면: [1] [2 3 4 5] [6]