색칠된 순열 정렬
시간 제한2초메모리 제한1024 MB
위치마다 색이 칠해진 순열을 정렬할 때, 두 원소 교환(S원)이나 한 색 위치의 재배열(C_i원) 중 골라 드는 최소 비용을 구합니다.
문제
순열 이 주어진다. 이 순열은 1부터 까지의 정수를 한 번씩 담고 있다. 1부터 까지의 각 위치는 가지 색 중 하나로 칠해져 있다. 이 순열을 정렬하려고 한다. 다음 두 종류의 연산을 원하는 만큼 적용할 수 있다.
- 임의의 두 원소를 교환한다. 이 연산의 비용은 코인이다.
- 색 를 하나 고르고, 색이 인 위치의 원소들을 원하는 대로 다시 배열한다. 이 연산의 비용은 코인이다.
칠해진 것은 원소가 아니라 위치다. 두 원소를 교환해도 위치의 색은 그대로다. 순열을 정렬하는 데 드는 코인의 최솟값을 구하라.
입력
첫 줄에 테스트 케이스의 개수 ()가 주어진다.
각 테스트 케이스의 첫 줄에는 과 (, )가 주어진다. 둘째 줄에는 ()가 주어진다. 셋째 줄에는 순열 (, 모든 는 서로 다르다)이 주어진다. 넷째 줄에는 각 위치의 색 ()이 주어진다.
모든 테스트 케이스의 을 합하면 를 넘지 않는다.
출력
각 테스트 케이스마다 순열을 정렬하는 데 필요한 코인의 최솟값을 한 줄에 하나씩 출력한다.
힌트
첫 번째 테스트 케이스에서는 교환 연산을 3번 적용하면 순열이 정렬된다. 순서로 바뀌며, 총 3코인이 든다. 색 1인 위치의 원소를 모두 재배열해도 되지만 10코인이 들어 더 비싸다.
두 번째 테스트 케이스는 연산 비용만 첫 번째와 다르다. 여기서는 색 1인 위치를 재배열하는 데 1코인만 들므로 이 방법이 더 싸다.
세 번째 테스트 케이스의 최적 순서는 다음과 같다. 색 2인 위치를 재배열해 을 만든다(1코인). 이어서 와 를 교환해 을 만든다(10코인). 마지막으로 색 1인 위치를 재배열해 을 만든다(1코인). 합계는 12코인이다.
네 번째 테스트 케이스는 이미 정렬되어 있으므로 코인이 들지 않는다.