結果
| 問題 | No.2977 Kth Xor Pair |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-10-30 01:22:01 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,085 ms / 3,000 ms |
| コード長 | 5,938 bytes |
| コンパイル時間 | 382 ms |
| コンパイル使用メモリ | 82,360 KB |
| 実行使用メモリ | 156,552 KB |
| 最終ジャッジ日時 | 2025-10-30 01:22:32 |
| 合計ジャッジ時間 | 30,817 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 34 |
ソースコード
## https://yukicoder.me/problems/no/2977
def solve2(N, K, A):
array = []
for i in range(N):
for j in range(i + 1, N):
array.append(A[i] ^ A[j])
array.sort()
print(array[K - 1])
def main():
N, K = map(int, input().split())
A = list(map(int, input().split()))
max_a = max(A)
for k in reversed(range(40)):
if (1 << k) & max_a > 0:
max_k = k
break
A.sort()
answer = 0
target_ranges = [[i + 1, N - 1] for i in range(N)]
target_ranges[N - 1] = [-1, -1]
for k in reversed(range(max_k + 1)):
array = [-1] * N
for i in range(N):
array[i] = 1 if (1 << k) & A[i] > 0 else 0
# 0の数を計算
z = 0
for i in range(N):
if target_ranges[i][0] == -1:
continue
if array[i] == 0:
if array[target_ranges[i][1]] == 0:
z += target_ranges[i][1] - target_ranges[i][0] + 1
elif array[target_ranges[i][0]] == 0:
low = target_ranges[i][0]
high = target_ranges[i][1]
while high - low > 1:
mid = (high + low) // 2
if array[mid] == 0:
low = mid
else:
high = mid
if array[high] == 0:
z += high - target_ranges[i][0] + 1
else:
z += low - target_ranges[i][0] + 1
else:
if array[target_ranges[i][0]] == 1:
z += target_ranges[i][1] - target_ranges[i][0] + 1
elif array[target_ranges[i][1]] == 1:
low = target_ranges[i][0]
high = target_ranges[i][1]
while high - low > 1:
mid = (high + low) // 2
if array[mid] == 1:
high = mid
else:
low = mid
if array[low] == 1:
z += target_ranges[i][1] - low + 1
else:
z += target_ranges[i][1] - high + 1
if z < K:
K -= z
answer += (1 << k)
for i in range(N):
if target_ranges[i][0] == -1:
continue
if array[i] == 0:
if array[target_ranges[i][1]] == 0:
target_ranges[i][0] = -1
target_ranges[i][1] = -1
continue
else:
# 1を求める
low = target_ranges[i][0]
high = target_ranges[i][1]
while high - low > 1:
mid = (high + low) // 2
if array[mid] == 1:
high = mid
else:
low = mid
if array[low] == 1:
target_ranges[i][0] = low
else:
target_ranges[i][0] = high
else:
if array[target_ranges[i][0]] == 1:
target_ranges[i][0] = -1
target_ranges[i][1] = -1
continue
else:
# 0を求める
low = target_ranges[i][0]
high = target_ranges[i][1]
while high - low > 1:
mid = (high + low) // 2
if array[mid] == 0:
low = mid
else:
high = mid
if array[high] == 0:
target_ranges[i][1] = high
else:
target_ranges[i][1] = low
else:
# 0となる範囲を求める
for i in range(N):
if target_ranges[i][0] == -1:
continue
if array[i] == 0:
if array[target_ranges[i][0]] == 1:
target_ranges[i][0] = -1
target_ranges[i][1] = -1
continue
else:
low = target_ranges[i][0]
high = target_ranges[i][1]
while high - low > 1:
mid = (high + low) // 2
if array[mid] == 0:
low = mid
else:
high = mid
if array[high] == 0:
target_ranges[i][1] = high
else:
target_ranges[i][1] = low
else:
if array[target_ranges[i][1]] == 0:
target_ranges[i][0] = -1
target_ranges[i][1] = -1
continue
else:
low = target_ranges[i][0]
high = target_ranges[i][1]
while high - low > 1:
mid = (high + low) // 2
if array[mid] == 1:
high = mid
else:
low = mid
if array[low] == 1:
target_ranges[i][0] = low
else:
target_ranges[i][0] = high
print(answer)
if __name__ == "__main__":
main()