結果
| 問題 |
No.2844 Birthday Party Decoration
|
| コンテスト | |
| ユーザー |
akasia_midori
|
| 提出日時 | 2024-08-23 22:21:50 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,808 bytes |
| コンパイル時間 | 331 ms |
| コンパイル使用メモリ | 82,428 KB |
| 実行使用メモリ | 78,044 KB |
| 最終ジャッジ日時 | 2024-08-23 22:21:52 |
| 合計ジャッジ時間 | 1,599 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | WA * 4 |
ソースコード
def oi(): return int(input())
def os(): return input().rstrip()
def mi(): return list(map(int, input().split()))
# import sys
# input = sys.stdin.readline
# import sys
# sys.setrecursionlimit(10**8)
# import pypyjit
# pypyjit.set_param('max_unroll_recursion=-1')
input_count = 0
T = oi()
def solve(N,X,C):
# 左右で各bitが埋まる最短の移動距離を調べる
left = [0] * N
right = [float("inf")] * N
dictC = {}
maxC = 0
for i, c in enumerate(C):
dictC[c] = i
maxC = max(maxC, c)
maxC += 1
sums = 0
for i, b in enumerate(bin(X)[2:].rjust(maxC, "0")[::-1]):
if i in dictC:
if b=="0":
# これまでの和にどれだけ足せばいい?
left[dictC[i]] = (pow(2,i) - sums)
else:
#今が1bit立っているということは0で達成できる
left[dictC[i]] = 0
sums += pow(2, i) * int(b)
# print(sums)
sums = 0
for i, b in enumerate(bin(X)[2:].rjust(maxC, "0")[::-1]):
if i in dictC:
if b=="0":
if X >= pow(2,i):
# これまでの和からどれだけ引けばいい?
right[dictC[i]] = sums+1
else:
right[dictC[i]] = 0
sums += pow(2, i) * int(b)
id_left = [(l,i) for i,l in enumerate(left)]
out = float("inf")
nexts = 0
for a in sorted(id_left, reverse=True):
if a[0] != 0:
if out >= (nexts+a[0])*2:
out = (nexts+a[0])*2
else:
break
nexts = right[a[1]]
if out == float("inf"):
print(0)
else:
print(out)
# print(sums)
for _ in range(T):
N, X = mi()
C = mi()
solve(N,X,C)
akasia_midori