結果

問題 No.3789 Binary 0-count Sequence
コンテスト
ユーザー hiro1729
提出日時 2026-11-06 18:00:27
言語 PyPy3
(8.0.1 + ACL)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
WA  
実行時間 -
コード長 1,225 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 112 ms
コンパイル使用メモリ 64,420 KB
実行使用メモリ 146,888 KB
最終ジャッジ日時 2026-11-06 21:13:44
合計ジャッジ時間 6,372 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge7_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 11 WA * 6
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

def f(n):
	if n == 0:
		return 1
	return n.bit_length() - n.bit_count()

def solve(A):
	N = len(A)
	if min(A) < 0:
		return -1
	if N == 1:
		if A[0] == 1:
			return 0
		else:
			return 1 << A[0]
	if N == 2:
		if A[0] > A[1] + 1:
			return -1
		if A[0] == 0:
			if A[1] >= 1:
				return (1 << A[1]) - 1
			else:
				return -1
		if A[0] == 1 and A[1] == 0:
			return 0
		return (1 << (A[1] + 1)) + (1 << (A[1] - A[0] + 1)) - 1
	ok_0 = True
	for i in range(N):
		if A[i] != f(i):
			ok_0 = False
			break
	if ok_0:
		return 0
	ok_1 = True
	for i in range(N):
		if A[i] != f(i):
			ok_1 = False
			break
	if ok_1:
		return 1
	res = -1
	ok_even = True
	for i in range(0, N - 1, 2):
		if A[i + 1] != A[i] - 1:
			ok_even = False
			break
	if ok_even:
		B = [A[i] - 1 for i in range(0, N, 2)]
		r = solve(B)
		if r > 0:
			res = 2 * r
		if r == 0 and N <= 4:
			res = 4
	ok_odd = True
	for i in range(1, N - 1, 2):
		if A[i + 1] != A[i] - 1:
			ok_odd = False
			break
	if ok_odd:
		B = [A[0]] + [A[i] - 1 for i in range(1, N, 2)]
		r = solve(B)
		if r > 0:
			res = 2 * r + 1
		if r == 0 and N <= 3:
			res = 5
	return res

T = int(input())
for _ in range(T):
	N = int(input())
	A = list(map(int, input().split()))
	print(solve(A))
0