첫번째 행부터 차례대로 살펴보면서 경우에 따라 다음과 같이 처리합니다.
이때는 특별한 처리 없이 넘어갑니다.
번째 행을 전부 흰색으로 바꿉니다. 즉, 를 으로 바꿉니다.
크기의 그리드를 흰색으로 바꿉니다. 이때, 번째 행에서 제일 왼쪽에 있는 검정색 칸을 첫번째 행, 첫번째 열로 두어서 흰색으로 칠합니다.
는 으로, 은 흰색으로 칠하기 전에 번째 행의 제일 왼쪽 칸이 검정색이면 로, 흰색이면 로 바꿔줍니다.
위와 같이 처리하면서 연산을 수행한 횟수를 세면 됩니다. 시간복잡도는 입니다.
이 문제를 다음과 같이 바꿔서 생각할 수 있습니다.
트리의 정점을 가지의 색으로 칠합니다. 그리고 정점 를 칠한 색을 라고 한다면 의 최솟값을 구합니다.
이 문제는 DP를 사용해서 구할 수 있습니다. 를 번째 정점을 번 색으로 칠했을 때 의 최솟값으로 설정하고 트리 DP를 하면 됩니다.
하지만 를 너무 큰 값으로 설정하면 TLE나 MLE를 받을 수 있습니다. 그래서 답을 구하기에 충분할 만큼만 를 최대한 작게 잡아주는것이 필요합니다. 저는 색을 칠할 때 남아있는 정점의 최소 을 칠해줘야 한다는 것을 보여주었고 이면 를 만족하므로 로 설정해서 문제를 해결했습니다.
하지만 를 더 잡게 잡아줘도 AC를 받을 수 있었습니다. 그래서 에디토리얼을 참고해보니 로 잡아줘도 됐었고 그래서 로 잡아줘도 AC를 받을 수 있다고 합니다.
증명은 다음과 같습니다.
를 최솟값을 구하기 위해 개의 색을 사용해야하는 경우 중에서 정점의 갯수가 가장 작은 트리의 정점의 갯수로 정의하면 다음이 성립합니다.
즉, 이 성립하고 그래서 만 잡아줘도 답을 구하는데 충분합니다.
참고로, 에디토리얼에 의하면 로 잡았을때의 반례가 존재한다고 합니다. 물론 저는 못찾을것 같긴하네요;;
시간 복잡도는 입니다. 에디토리얼에서 언급한 내용을 적용하면 에 해결할 수 있습니다.
먼저 와 의 요소를 확인해서 한쪽에는 들어있지만 다른쪽에는 안 들어있는 값이 있는지 확인합니다. 있으면 당연히 불가능이고 없으면 아래로 넘어갑니다.
일단 와 에 적용되는 연산은 transposition이므로 parity가 서로 다르면 당연히 안됩니다.
그럼 같을 때는 어떨까요? 이 때는 무조건 가능합니다. 임의의 transposition은 형태의 transposition의 합성으로 바꿀 수 있습니다. 즉, 의 합성 만으로도 , 를 나타낼 수 있고 연산을 사용하여 차근 차근 하나씩 제거하면 됩니다. 다른 수열 하나가 먼저 끝난 경우 나머지 수열의 작업을 계속 수행하면서 이미 끝난 수열은 계속 똑같은 요소 두개를 골라서 왔다 갔다만 해주면 됩니다. 이렇게 되면 와 둘 다 오름차순으로 정렬되어 같아지게 됩니다.
즉, 와 의 parity만 같은지 판별하면 됩니다.