PS/Codeforces

Div.2 #930 C - Bitwise Operation Wizard

조금씩 차근차근 2024. 11. 8. 10:51

https://codeforces.com/contest/1937/problem/C

  • 현재 주어진 연산으로 가능한 것
    • 최댓값 찾기: a|a < b|b
    • 최솟값 찾기: a|a < b|b
  • 현재 주어진 순열은 [0, n-1] 범위를 갖는다.
    • 따라서, XOR로 만들 수 있는 최대의 정수는 상한이 정해져 있다.
    • px ^ py = (n - 1의 msb) * 2 - 1
  • 그렇다면, 저 상한을 어떻게 만들어낼 것인가?
    1. 최댓값(n-1)을 찾는다.
    2. 최댓값과 or 연산을 수행하여 가장 큰 값을 만드는 인덱스들을 찾는다.
      1. 해당 인덱스들의 집합에 들어가기 위해선 최댓값의 하위 비트가 0인 비트들을 1로 채울 수 있어야 한다. 
      2. 예시) 11010 -> 1101, 101, 111, 10111
      3. XOR 도 결국 OR 되어야 하는데, 그냥 이러면 어떻게 답 안나오나 라는 느낌으로 시도해 봤음
    3. XOR하여 최대가 되게 하려면, n-1과 겹치는 1 비트가 없어야 한다.
    4. 겹치는 1비트가 존재한다면, 그 값은 "큰 값을 만드는 인덱스들" 중에선 "큰 편"에 속할 것이다.
    5. 아무것도 n-1과 겹치지 않으려면, "가장 작은 값"을 갖는 인덱스를 찾아야 한다.
    6. 찾은 인덱스들을 순회하며, 최솟값을 갖는 인덱스를 찾는다.

'PS > Codeforces' 카테고리의 다른 글

Div.2 #961 C - WA  (0) 2024.09.29
Div.2 #965 C  (0) 2024.09.27
Div.2 #967 C  (0) 2024.09.27
Div.2 #968 D1  (0) 2024.09.27
Div.2 #953 C  (0) 2024.09.27