結果
| 問題 |
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 |
ソースコード
#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')
navel_tos