BOJ 24697 Interesting Subsegments
문제 내용
과 의 값이 주어집니다. 0, 1, 2만을 원소로 갖는 길이 의 배열을 만들려고 합니다. 그 배열의 부분 배열 중에서 합이 3의 배수인 것의 개수가 가 되도록 할 수 있으면 그러한 배열들 중 사전 순으로 최소인 것을 출력하고, 불가능하면 -1을 출력하세요.
문제 풀이
스포일러
먼저, 배열이 주어졌을 때 합이 3의 배수인 부분 배열의 개수를 구하는 방법을 생각해 봅시다.
그 배열의 누적 합을 생각해 보면, 서로 다른 두 곳의 누적합의 차이가 3의 배수이면 그 두 곳을 양 끝점으로 하는 부분 배열의 합은 3의 배수입니다. 따라서, 누적합 값들 중에서 3으로 나눈 나머지가 인 것의 개수를 라고 하면, 합이 3의 배수인 부분 배열의 개수는 와 같습니다. (0의 경우 원소 0개를 포함한 누적합도 선택 가능합니다.)
또한 도 성립하므로, 에 을 대입하여 과 에 대한 이차방정식을 얻을 수 있습니다.
이제 가 정해졌을 때 사전 순으로 최소인 배열을 구하는 방법을 생각해 봅시다.
사전 순으로 최소이려면 일단 맨 앞에 0이 가능한 한 많아야 합니다. 0개의 합도 0이므로, 개의 0을 맨 앞에 몰아서 배치해 줍니다. 그 다음에는 0이 올 수 없으므로 1이나 2가 와야 하는데, 이 0이 아니라면 1이 먼저 오는 것이 이득입니다. 이제 누적합이 서로 같은 값이 오면 원래의 배열에는 0이 적히게 되므로, 남은 1을 모두 연달아서 배치합니다.
이제 서로 다른 들 중에서 최적을 고르려면 이 가능한 한 많은 것, 그 중에서는 이 가능한 한 많은 것을 골라야 함을 알 수 있습니다.
일단 이 가능한 한 커야 하므로, 을 큰 것부터 고정해 봅니다. 그러면 앞에서 얻은 이차방정식을 풀어 볼 수 있습니다. 그 결과에 문제가 없으면 ( 모두 음이 아닌 정수) 그 중에서 이 큰 것에 해당하는 배열을 출력하면 됩니다.