結果

問題 No.2823 PEX (Predecessing Excluded Value) Game
ユーザー navel_tos
提出日時 2024-07-26 23:27:58
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 401 ms / 2,000 ms
コード長 2,808 bytes
コンパイル時間 452 ms
コンパイル使用メモリ 82,168 KB
実行使用メモリ 125,276 KB
最終ジャッジ日時 2024-07-27 21:24:14
合計ジャッジ時間 5,355 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 51
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#yukicoder 2823 PEX Game
from random import randint
# Grundy
def brute(S):
D = dict()
E = dict()
Q = [tuple(sorted(S))]
while Q:
T = Q.pop()
if T not in D: #
Q.append(T)
D[T] = -1
E[T] = []
#
R = [0] * (max(T) + 1)
for i in T:
R[i] = 1
if sum(R[1: len(T) + 1]) == len(T):
D[T] = 0
continue
for i in range(1, max(T) + 1):
if R[i] == 0: continue
for j in range(i - 1, -1, -1):
if R[j] == 0: break
if j == 0: continue
R[i], R[j] = R[j], R[i]
nT = tuple([i for i in range(1, len(R)) if R[i] == 1])
R[i], R[j] = R[j], R[i]
Q.append(nT)
E[T].append(nT)
elif D[T] != -1:
continue
elif D[T] == -1: #
X = set()
for nT in E[T]:
assert D[nT] >= 0
X.add(D[nT])
for i in range(10 ** 7):
if i not in X:
D[T] = i
break
return D[tuple(sorted(S))]
#
#x:
def esper(Lt, Rt, x = 0):
d = Rt - Lt + 1
return 0 if (Lt - x) & 1 == 1 else d
def test(Lt, Rt):
D = [i for i in range(Lt, Rt + 1)]
assert brute(D) == esper(Lt, Rt)
#
def make_test(maxN = 12):
P = []
while len(P) == 0 or randint(0, 3):
back = P[-1] if len(P) else 0
if back >= maxN - 1: break
Lt = randint(back + 1, maxN - 1)
Rt = randint(Lt + 1, maxN)
P.append(Lt)
P.append(Rt)
assert len(P) > 0 and len(P) & 1 == 0
Q = []
for i in range(len(P) // 2):
Q.append((P[i << 1], P[i << 1 | 1]))
return Q
def solve(P):
#
bL, bR = P[0]
Q = []
for i in range(1, len(P)):
Lt, Rt = P[i]
if bR + 1 == Lt:
bR = Rt
continue
else:
Q.append((bL, bR))
bL, bR = Lt, Rt
Q.append((bL, bR))
ans = 0
cnt = 0
for Lt, Rt in Q:
ans ^= esper(Lt, Rt, cnt)
cnt += Rt - Lt + 1
return ans
#
def act(time = 1000):
for _ in range(1, time + 1):
P = make_test(15)
Q = []
for Lt, Rt in P:
for i in range(Lt, Rt + 1): Q.append(i)
assert brute(Q) == solve(P), P
#
N = int(input())
P = [tuple(map(int, input().split())) for _ in range(N)]
ans = solve(P)
print('First' if ans else 'Second')
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0