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
- 그렇다면, 저 상한을 어떻게 만들어낼 것인가?
- 최댓값(n-1)을 찾는다.
- 최댓값과 or 연산을 수행하여 가장 큰 값을 만드는 인덱스들을 찾는다.
- 해당 인덱스들의 집합에 들어가기 위해선 최댓값의 하위 비트가 0인 비트들을 1로 채울 수 있어야 한다.
- 예시) 11010 -> 1101, 101, 111, 10111
XOR 도 결국 OR 되어야 하는데, 그냥 이러면 어떻게 답 안나오나 라는 느낌으로 시도해 봤음
- XOR하여 최대가 되게 하려면, n-1과 겹치는 1 비트가 없어야 한다.
- 겹치는 1비트가 존재한다면, 그 값은 "큰 값을 만드는 인덱스들" 중에선 "큰 편"에 속할 것이다.
- 아무것도 n-1과 겹치지 않으려면, "가장 작은 값"을 갖는 인덱스를 찾아야 한다.
- 찾은 인덱스들을 순회하며, 최솟값을 갖는 인덱스를 찾는다.
'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 |