1. 원소 하나를 지웠을 때의 mex
배열 전체의 mex를 이라고 하자. 은 모두 등장하고, 은 등장하지 않는다.
하나를 지우면 다음 두 경우로 나뉜다.
따라서 인 위치는 정확히 보다 작은 값이 한 번만 등장하는 위치이다. 인 위치에서는 반드시
이어야 한다. 여기서 는 비트 XOR이다.
에서 의 개수를 라고 하자. 같은 양의 정수 가 에 등장하는 횟수를 라고 하자. 을 정하면 인 위치의 값은 모두 결정된다.
이 값들 중 보다 작은 값이 정확히 한 번 등장하면 모순이다. 그런 값은 을 만들어야 하기 때문이다. 반면 두 번 이상 등장하는 값에는 문제가 없다. 아직 등장하지 않은 이상 미만의 값들은 인 위치에 하나씩 배치하면 된다.
따라서 이 가능할 필요충분조건은 다음과 같다.
은 배열의 mex이므로 이다.
2. 작은 입력: mex 후보를 모두 확인하기
을 모두 시도한다. 각 후보에 대해 인 위치를 으로 채우고, 미만에서 빠진 값들을 인 위치에 하나씩 넣는다. 빠진 값의 수가 와 다르면 해당 후보는 불가능하다.
이후 각 위치를 직접 제외하여 mex를 다시 계산하면 후보 하나를 에 확인할 수 있다. 전체 시간 복잡도는 이며 서브태스크 3을 해결한다.
앞 절의 필요충분조건을 이용하면 더 빠르게 확인할 수 있다. 후보 하나마다 미만의 값들의 등장 횟수를 세고, 한 번 등장하는 값이 없는지와 빠진 값의 수가 인지 확인한다. 후보당 , 전체 이므로 서브태스크 4를 해결한다.
3. XOR 비교를 최상위 비트로 바꾸기
양의 정수 의 가장 높은 비트 위치를 라고 하자. 과 은 보다 높은 모든 비트가 같고, 번째 비트가 다르다. 따라서
이다.
양의 들을 최상위 비트 위치별로 묶는다. 각 비트 에 대해 다음 정보를 계산한다.
정확히 한 번 등장하는 값이 있는 비트는 에서 선택할 수 없다. 그 비트를 선택하면 그 값이 미만의 유일한 원소가 되기 때문이다.
이러한 금지 비트를 제외하고, 의 번째 비트가 인지 나타내는 값을 라고 하자. 미만에서 이미 등장한 서로 다른 값의 수는 이다. 그러므로
즉, 허용된 비트마다 가중치
를 하나씩 두고, 일부 비트를 선택하여 가중치 합을 로 만들면 된다.
최상위 비트가 인 양의 정수는 정확히 개이므로 이며, 모든 가중치는 음이 아니다.
4. 부분합 DP와 배열 복원
를 지금까지 처리한 비트 중 일부를 선택하여 합 를 만들 수 있는지로 정의한다. 처음에는 만 참이다.
각 허용 비트의 양의 가중치 에 대해, 순서로
를 적용한다. 내림차순으로 갱신하므로 같은 비트를 두 번 선택하지 않는다. 처음 도달한 상태마다 이전 합과 사용한 비트를 저장하면 실제 선택도 복원할 수 있다.
가중치가 인 비트는 선택하지 않아도 합에 영향이 없으므로 건너뛴다. 보다 큰 가중치도 사용할 수 없다.
가 거짓이면 -1을 출력한다. 참이면 선택한 비트들로 을 복원하고 다음과 같이 를 만든다.
5. 정확성 증명
어떤 정답 배열의 mex가 이라면, 첫 절의 관찰에 의해 금지 비트를 선택할 수 없고 가중치 합이 반드시 이다. 따라서 정답이 존재하면 DP도 합 에 도달한다. 가중치가 인 비트를 버려도 합은 바뀌지 않으므로 이를 건너뛰는 것은 안전하다.
반대로 DP가 선택한 비트들로 만든 을 생각하자. 선택된 묶음의 서로 다른 값들은 각각 두 번 이상 등장한다. 그 개수를 라고 하면
따라서 복원한 도 유효한 mex 후보 범위에 있다.
인 위치에서는 이 될 수 없다. 이면 이 되어야 하기 때문이다. 이 위치들이 채우는 미만의 서로 다른 값은 정확히 개이며, 모두 두 번 이상 등장한다. 남은 개의 값은 인 위치에 하나씩 배치한다.
따라서 완성된 배열은 부터 까지를 모두 포함하고 을 포함하지 않아 mex가 이다. 인 위치의 값은 미만에서 유일하므로 제거 후 mex가 자기 자신이다. 인 위치를 제거하면 mex는 으로 유지된다. 두 경우 모두 요구한 XOR 관계를 만족한다.
또한 이고 이므로 이다. 빠진 값들도 보다 작으므로 모든 출력값이 허용 범위를 만족한다.
6. 특수 조건 서브태스크
서브태스크 1에서는 모든 이다. 로 두면 이 없으므로 어떤 원소를 지워도 mex는 이다. 따라서 그대로 출력하면 된다. 시간 복잡도는 이다.
서브태스크 2에서는 이다. 모두 이면 를 의 순열로 만들면 된다. 이 하나 이상 있다면 정답이 존재할 필요충분조건은 가 짝수인 것이다.
이를 보이기 위해 인 위치의 값 을 생각하자. 이 짝수이면 이 값은 이므로 미만의 모든 값은 인 위치가 채워야 하고 이다. 이 홀수이면 이 값은 이다. 이 경우 이 정확히 한 번 등장하면 모순이고, 두 번 이상 등장하면 이다. 두 경우 모두 가 짝수이다.
가 짝수이면 로 두고, 인 위치에 을 하나씩, 인 위치에 을 넣으면 된다. 시간 복잡도는 이다.
7. 복잡도
양의 를 정렬하여 값별 등장 횟수와 비트별 정보를 구하면 시간이 필요하다. 비트는 부터 까지 있으므로 DP에는 , 배열 복원에는 시간이 필요하다.
전체 시간 복잡도는 , 공간 복잡도는 이다. 모든 테스트케이스의 합이 이하이므로 전체 제한을 만족한다.
Solution written by GPT