DOJ logoDOJ
문제
최근 추가된 문제들저장한 문제
카테고리DLC대회그룹팀게시판
랭킹
문제 풀이 랭킹스트릭 랭킹DOJ Power 랭킹
현황
문제 제안로그인회원가입
DOJ logoDOJ

OI 서브태스크 채점, Elo 레이팅, Discord 인증을 갖춘 커뮤니티 온라인 저지.

문제
문제 목록카테고리
커뮤니티
대회랭킹게시판공지사항외부 대회 개최이용 안내
계정
로그인회원가입채점 현황
정책
이용약관DLC 이용 규칙개인정보 처리방침API 사용 설명서언어별 채점 환경대회 순위 보상레이팅과 퍼포먼스
© 2026 DOJ
모든 권리 보유
해설

MEX with XOR

문제로 돌아가기

해설

1. 원소 하나를 지웠을 때의 mex

배열 AAA 전체의 mex를 mmm이라고 하자. 0,1,⋯ ,m−10,1,\cdots,m-10,1,⋯,m−1은 모두 등장하고, mmm은 등장하지 않는다.

AiA_iAi​ 하나를 지우면 다음 두 경우로 나뉜다.

  • Ai<mA_i<mAi​<m이고 AiA_iAi​가 정확히 한 번 등장했다면 Mi=AiM_i=A_i이다.

따라서 Bi=0B_i=0Bi​=0인 위치는 정확히 mmm보다 작은 값이 한 번만 등장하는 위치이다. Bi≠0B_i\ne0Bi​인 위치에서는 반드시

Ai=Bi⊕mA_i=B_i\oplus mAi​=Bi​⊕m

이어야 한다. 여기서 ⊕\oplus⊕는 비트 XOR이다.

BBB에서 000의 개수를 ZZZ라고 하자. 같은 양의 정수 vvv가 BBB에 등장하는 횟수를 f(v)f(v)f(v)라고 하자. 을 정하면 인 위치의 값은 모두 결정된다.

이 값들 중 mmm보다 작은 값이 정확히 한 번 등장하면 모순이다. 그런 값은 Bi=0B_i=0Bi​=0을 만들어야 하기 때문이다. 반면 두 번 이상 등장하는 값에는 문제가 없다. 아직 등장하지 않은 000 이상 mmm 미만의 값들은 B인 위치에 하나씩 배치하면 된다.

따라서 mmm이 가능할 필요충분조건은 다음과 같다.

  • v⊕m<mv\oplus m<mv⊕m<m인 모든 양의 정수 vvv에 대해 f(v)≠1f(v)\ne1f(v)=1이다.

mmm은 배열의 mex이므로 0≤m≤N0\le m\le N0≤m≤N이다.

2. 작은 입력: mex 후보를 모두 확인하기

m=0,1,⋯ ,Nm=0,1,\cdots,Nm=0,1,⋯,N을 모두 시도한다. 각 후보에 대해 Bi≠0B_i\ne0Bi​인 위치를 으로 채우고, 미만에서 빠진 값들을 인 위치에 하나씩 넣는다. 빠진 값의 수가 와 다르면 해당 후보는 불가능하다.

이후 각 위치를 직접 제외하여 mex를 다시 계산하면 후보 하나를 O(N2)O(N^2)O(N2)에 확인할 수 있다. 전체 시간 복잡도는 O(N3)O(N^3)O(N3)이며 서브태스크 3을 해결한다.

앞 절의 필요충분조건을 이용하면 더 빠르게 확인할 수 있다. 후보 하나마다 mmm 미만의 값들의 등장 횟수를 세고, 한 번 등장하는 값이 없는지와 빠진 값의 수가 ZZZ인지 확인한다. 후보당 O(N)O(N)O(N), 전체 O(N2)O(N^2)O(N2)이므로 서브태스크 4를 해결한다.

3. XOR 비교를 최상위 비트로 바꾸기

양의 정수 vvv의 가장 높은 111 비트 위치를 hhh라고 하자. v⊕mv\oplus mv⊕m과 mmm은 hhh보다 높은 모든 비트가 같고, 번째 비트가 다르다. 따라서

v⊕m<m⟺m의 h번째 비트가 1v\oplus m<m \quad\Longleftrightarrow\quad m\text{의 }h\text{번째 비트가 }1v⊕m<m⟺m의 h번째 비트가 1

이다.

양의 BiB_iBi​들을 최상위 비트 위치별로 묶는다. 각 비트 hhh에 대해 다음 정보를 계산한다.

  • ChC_hCh​: 최상위 비트가 hhh인 서로 다른 양의 BiB_iBi​의 개수.
  • 해당 묶음에 정확히 한 번 등장하는 값이 있는지 여부.

정확히 한 번 등장하는 값이 있는 비트는 mmm에서 선택할 수 없다. 그 비트를 선택하면 그 값이 mmm 미만의 유일한 원소가 되기 때문이다.

이러한 금지 비트를 제외하고, mmm의 hhh번째 비트가 111인지 나타내는 값을 shs_hsh​라고 하자. mmm 미만에서 이미 등장한 서로 다른 값의 수는 이다. 그러므로

Z=m−∑hChsh=∑h(2h−Ch)sh.Z=m-\sum_h C_hs_h=\sum_h(2^h-C_h)s_h.Z=m−h∑​Ch​

즉, 허용된 비트마다 가중치

Wh=2h−ChW_h=2^h-C_hWh​=2h−Ch​

를 하나씩 두고, 일부 비트를 선택하여 가중치 합을 ZZZ로 만들면 된다.

최상위 비트가 hhh인 양의 정수는 정확히 2h2^h2h개이므로 Ch≤2hC_h\le2^hCh​≤2이며, 모든 가중치는 음이 아니다.

4. 부분합 DP와 배열 복원

dp[s]dp[s]dp[s]를 지금까지 처리한 비트 중 일부를 선택하여 합 sss를 만들 수 있는지로 정의한다. 처음에는 dp[0]dp[0]dp[0]만 참이다.

각 허용 비트의 양의 가중치 WhW_hWh​에 대해, s=Z,Z−1,⋯ ,Whs=Z,Z-1,\cdots,W_hs=Z,Z−1,⋯,W 순서로

dp[s]←dp[s]∨dp[s−Wh]dp[s]\leftarrow dp[s]\lor dp[s-W_h]dp[s]←dp[s]∨dp[s−Wh​]

를 적용한다. 내림차순으로 갱신하므로 같은 비트를 두 번 선택하지 않는다. 처음 도달한 상태마다 이전 합과 사용한 비트를 저장하면 실제 선택도 복원할 수 있다.

가중치가 000인 비트는 선택하지 않아도 합에 영향이 없으므로 건너뛴다. ZZZ보다 큰 가중치도 사용할 수 없다.

dp[Z]dp[Z]dp[Z]가 거짓이면 -1을 출력한다. 참이면 선택한 비트들로 mmm을 복원하고 다음과 같이 AAA를 만든다.

  • Bi≠0B_i\ne0Bi​=0이면 Ai=Bi⊕mA_i=B_i\oplus mAi​으로 정한다.

5. 정확성 증명

어떤 정답 배열의 mex가 mmm이라면, 첫 절의 관찰에 의해 금지 비트를 선택할 수 없고 가중치 합이 반드시 ZZZ이다. 따라서 정답이 존재하면 DP도 합 ZZZ에 도달한다. 가중치가 000인 비트를 버려도 합은 바뀌지 않으므로 이를 건너뛰는 것은 안전하다.

반대로 DP가 선택한 비트들로 만든 mmm을 생각하자. 선택된 묶음의 서로 다른 값들은 각각 두 번 이상 등장한다. 그 개수를 DDD라고 하면

m=Z+D≤Z+N−Z2≤N.m=Z+D\le Z+\frac{N-Z}{2}\le N.m=Z+D≤Z+2N−Z​

따라서 복원한 mmm도 유효한 mex 후보 범위에 있다.

Bi≠0B_i\ne0Bi​=0인 위치에서는 Ai=mA_i=mAi​=이 될 수 없다. 이면 이 되어야 하기 때문이다. 이 위치들이 채우는 미만의 서로 다른 값은 정확히 개이며, 모두 두 번 이상 등장한다. 남은 개의 값은 인 위치에 하나씩 배치한다.

따라서 완성된 배열은 000부터 m−1m-1m−1까지를 모두 포함하고 mmm을 포함하지 않아 mex가 mmm이다. Bi=0B_i=0B인 위치의 값은 미만에서 유일하므로 제거 후 mex가 자기 자신이다. 인 위치를 제거하면 mex는 으로 유지된다. 두 경우 모두 요구한 XOR 관계를 만족한다.

또한 m≤N<230m\le N<2^{30}m≤N<230이고 Bi<230B_i<2^{30}Bi​<이므로 이다. 빠진 값들도 보다 작으므로 모든 출력값이 허용 범위를 만족한다.

6. 특수 조건 서브태스크

서브태스크 1에서는 모든 Bi>0B_i>0Bi​>0이다. A=BA=BA=B로 두면 000이 없으므로 어떤 원소를 지워도 mex는 00이다. 따라서 그대로 출력하면 된다. 시간 복잡도는 이다.

서브태스크 2에서는 Bi∈{0,1}B_i\in\{0,1\}Bi​∈{0,1}이다. 모두 000이면 AAA를 0,1,⋯ ,N−1의 순열로 만들면 된다. 이 하나 이상 있다면 정답이 존재할 필요충분조건은 가 짝수인 것이다.

이를 보이기 위해 Bi=1B_i=1Bi​=1인 위치의 값 m⊕1m\oplus1m⊕1을 생각하자. mmm이 짝수이면 이 값은 m+1m+1이므로 미만의 모든 값은 인 위치가 채워야 하고 이다. 이 홀수이면 이 값은 이다. 이 경우 이 정확히 한 번 등장하면 모순이고, 두 번 이상 등장하면 이다. 두 경우 모두 가 짝수이다.

ZZZ가 짝수이면 m=Zm=Zm=Z로 두고, Bi=0B_i=0Bi​=0인 위치에 0,1,⋯ ,Z을 하나씩, 인 위치에 을 넣으면 된다. 시간 복잡도는 이다.

7. 복잡도

양의 BiB_iBi​를 정렬하여 값별 등장 횟수와 비트별 정보를 구하면 O(Nlog⁡N)O(N\log N)O(NlogN) 시간이 필요하다. 비트는 000부터 292929까지 있으므로 DP에는 , 배열 복원에는 시간이 필요하다.

전체 시간 복잡도는 O(Nlog⁡N+30Z)O(N\log N+30Z)O(NlogN+30Z), 공간 복잡도는 O(N)O(N)O(N)이다. 모든 테스트케이스의 NNN 합이 200 000200\,000 이하이므로 전체 제한을 만족한다.

Solution written by GPT

M
i​
=
Ai​
  • 그 밖의 경우에는 Mi=mM_i=mMi​=m이다.
  • =
    0
    mmm
    Bi≠0B_i\ne0Bi​=0
    i=0B_i=0
    Bi​=0
  • Bi≠0B_i\ne0Bi​=0인 위치에서 만들어진 서로 다른 값 중 mmm보다 작은 값의 개수가 정확히 m−Zm-Zm−Z이다.
  • =
    0
    Bi⊕mB_i\oplus mBi​⊕m
    mmm
    Bi=0B_i=0Bi​=0
    ZZZ
    hhh
    ∑hChsh\sum_h C_hs_h
    ∑h​Ch​sh​
    sh​
    =
    h∑​(2h−
    Ch​)sh​.
    h
    h​
    =
    Bi​⊕
    m
  • 위 값들에 등장하지 않은 0,1,⋯ ,m−10,1,\cdots,m-10,1,⋯,m−1을 찾는다.
  • 빠진 값들을 Bi=0B_i=0Bi​=0인 위치에 하나씩 배치한다.
  • ≤
    N.
    m
    Ai=mA_i=mAi​=m
    Bi=0B_i=0Bi​=0
    mmm
    DDD
    m−D=Zm-D=Zm−D=Z
    Bi=0B_i=0Bi​=0
    i
    ​
    =
    0
    mmm
    Bi≠0B_i\ne0Bi​=0
    mmm
    2
    30
    Bi⊕m<230B_i\oplus m<2^{30}Bi​⊕m<230
    mmm
    0
    O(N)O(N)O(N)
    0,1,\cdots,N-1
    0,1,⋯,N−1
    111
    ZZZ
    m
    +
    1
    mmm
    000
    Z=mZ=mZ=m
    mmm
    m−1m-1m−1
    111
    Z=m−1Z=m-1Z=m−1
    ZZZ
    −10,1,\cdots,Z-1
    0,1,⋯,Z−1
    Bi=1B_i=1Bi​=1
    Z+1Z+1Z+1
    O(N)O(N)O(N)
    O(30Z)O(30Z)O(30Z)
    O(N)O(N)O(N)
    200
    000