해설
결과 격자를 라고 하자.
먼저 다음 조건이 핵심이다.
이 조건이 깨지는 칸 가 있다면, 까지 같은 경로를 따라간 뒤 한 경로는 오른쪽-아래, 다른 경로는 아래-오른쪽으로 이동하고, 부터 다시 같은 경로를 따라가면 된다. 두 경로에서 달라지는 유일한 위치의 문자가 같으므로 같은 문자열을 얻는다.
반대로 서로 다른 두 최단 경로를 잡고 처음으로 다른 방향으로 이동하는 순간을 보자. 두 경로가 다음에 방문하는 칸은 어떤 과 이다. 위 조건에 의해 두 문자가 다르므로 두 경로가 만드는 문자열도 다르다.
따라서 격자가 멋있는 격자가 아닌 것과 위 조건은 동치이다.
가 같은 칸들을 하나의 반대각선이라고 하자. 위 조건은 각 반대각선의 값이 위에서 아래로 또는 중 하나여야 한다는 뜻이다. 서로 다른 반대각선 사이에는 아무 제약이 없다.
반대각선 하나의 길이를 이라 하자. 기준 패턴을 로 두고, 이 반대각선에서 와 가 다른 칸의 수를 라 하자. 이 반대각선을 기준 패턴으로 만들 때 필요한 반전 수는 , 반대 패턴으로 만들 때 필요한 반전 수는 이다.
따라서 이 반대각선의 최소 비용은
이고, 더 비싼 선택으로 바꿀 때 추가되는 비용은
이다.
모든 반대각선의 최소 비용 합을 라 하자. 반대각선 길이의 합은 이므로 가능한 최대 비용은 이다.
이제 와 사이의 모든 정수가 실제로 가능함을 보이면 된다. 반대각선을 길이의 오름차순으로 정렬한다. 길이가 인 반대각선의 는 과 같은 홀짝성을 가지며 이다. 길이 인 첫 반대각선 앞에는 각 길이 인 반대각선이 두 개씩 있다. 길이 에서는 이고, 홀수 길이에서는 항상 이다. 따라서 앞선 의 합을 라 하면 항상 이다. 같은 길이의 두 번째 이후 반대각선에서는 가 더 커질 뿐이다. 그러므로 항상
이다.
부분합이 를 모두 만들 수 있고 새 가중치가 이라면, 새 부분합은 를 모두 만들 수 있다. 길이 인 첫 반대각선부터 귀납하면 모든 의 부분합은 부터 그 합까지 끊김 없이 모두 가능하다.
따라서 정확히 번 반전하는 답이 존재할 필요충분조건은
이다.
실제 선택도 같은 귀납을 역순으로 사용하면 된다. 정렬된 의 누적합을 저장하고 라 하자. 뒤에서부터 보면서 현재 이 앞쪽 가중치의 누적합보다 크면 현재 반대각선의 더 비싼 패턴을 반드시 선택하고 에서 를 뺀다. 그렇지 않으면 더 싼 패턴을 선택한다. 위의 연속 부분합 성질 때문에 항상 정확히 으로 끝난다.
격자를 한 번 순회해 각 반대각선의 를 구하고, 반대각선 개를 정렬하면 된다. 시간 복잡도는 , 메모리 복잡도는 출력 격자를 제외하면 이다.
Solution written by GPT5.6