해설
문자열에 있는 1의 개수를 라 하고, 왼쪽부터 번째 1의 위치를 라 하자.
번째부터 번째까지의 1을 모두 포함하는 가장 짧은 구간을 연산에 사용하려면 다음 부등식이 필요하다.
이를 정리하면
가 된다. 편의상
로 두자.
다음 점화식으로 정의되는 구간 을 good이라고 하자.
일 때,
첫 번째 조건은 왼쪽 끝의 1을 먼저 지우는 경우이고, 두 번째 조건은 오른쪽 끝의 1을 먼저 지우는 경우이다.
을 감소시키는 순서로 순회하고 각 에 대해 을 증가시키면, 필요한 최솟값과 최댓값을 누적하여 모든 을 에 계산할 수 있다.
Lemma 1. 경계 바로 바깥에 0이 있는 good 구간은 내부의 1을 하나만 남길 수 있다.
구간 길이에 대해 귀납한다. 첫 번째 조건이 성립한다고 하자. 를 만족하는 가장 가까운 를 고르면, 번째 1을 포함하여 조건을 만족하는 연산 구간을 잡아 왼쪽 끝의 1을 지울 수 있다. 두 번째 조건이 성립하는 경우에는 대칭적으로 오른쪽 끝의 1을 지울 수 있다. 그 뒤 더 짧은 good 구간에 귀납 가정을 적용한다.
Lemma 2. 구간 가 good인 것과, 다음을 만족하는 가 존재하는 것은 동치이다.
즉, 구간의 최댓값이 등장하는 어떤 위치가 구간의 최솟값이 등장하는 어떤 위치보다 앞이거나 같다. 이는 good의 점화식에 대해 구간 길이로 귀납하면 증명할 수 있다.
이제 를 앞의 개 1을 good 구간들로 나누는 최소 구간 수라고 하자.
모든 good 구간을 이미 알고 있으므로 이 DP도 에 계산할 수 있다.
이제 가 답임을 보이면 된다.
Lemma 3. 연산을 한 번 수행해도 최소 good 분할 수는 감소하지 않는다.
연산 전후의 배열을 각각 라 하자. 연산으로 하나의 1을 지우면 배열에서는 원소 하나가 사라지고, 그 오른쪽 원소들이 모두 씩 증가한다.
이를 거꾸로 보면 의 한 위치에 값 를 삽입한 뒤, 그 오른쪽 접미사의 모든 값에서 를 빼면 가 된다. 삽입 위치를 포함하지 않는 good 블록은 모든 값이 그대로이거나 모두 씩 감소하므로 여전히 good이다.
삭제에 사용한 연산 구간의 양 끝 1을 라 하면 이다. 따라서
이므로 또는 중 하나가 성립한다.
이면 삽입 위치의 왼쪽에서 이상인 값을 포함하는 최초의 블록까지 합친다. 이면 오른쪽에서 이하인 값을 포함하는 최초의 블록까지 합친다. Lemma 2에 의해 합친 구간은 good이다.
삽입 위치가 블록 내부인 경우에도 을 이용하면, 삽입 전 블록이 good이면 삽입 후 블록도 good임을 Lemma 2로 보일 수 있다. 따라서 의 최소 good 분할 수는 의 최소 good 분할 수보다 클 수 없다. 즉, 실제 연산을 할수록 최소 good 분할 수는 감소하지 않는다.
Lemma 4. 초기 배열의 최소 good 분할은 실제 연산으로 만들 수 있다.
최소 good 분할의 블록을 왼쪽부터 처리한다. 이므로 첫 번째 블록의 왼쪽에는 0이 있어 Lemma 1을 적용할 수 있다.
한 블록을 1 하나로 줄인 뒤, 그 1이 다음 블록의 첫 번째 1과 붙어 있다고 하자. 두 1이 붙어 있으면 앞쪽 1의 값이 뒤쪽 1의 값보다 크므로, 앞쪽 1과 다음 good 블록을 합친 구간도 good이다. 이는 최소 good 분할의 블록 수를 더 줄일 수 있다는 뜻이므로 모순이다.
따라서 다음 블록의 왼쪽에는 항상 0이 존재하고, Lemma 1을 반복 적용하여 각 블록을 1 하나로 줄일 수 있다.
최종적으로 개의 1이 남았다고 하자. 최종 배열은 길이 인 good 구간 개로 나눌 수 있다. Lemma 3을 반복 적용하면
이다. 따라서 보다 적은 수의 1을 남길 수 없다. 반대로 Lemma 4에 의해 정확히 개의 1을 남길 수 있다.
그러므로 답은 이다. 인 경우에는 답이 이다.
각 테스트 케이스의 시간 복잡도는 이고, 공간 복잡도는 이다.
Solution written by GPT5.6