結果
問題 | No.2823 PEX (Predecessing Excluded Value) Game |
ユーザー |
![]() |
提出日時 | 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 Gamefrom 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] = -1E[T] = []#遷移先を全探索するR = [0] * (max(T) + 1)for i in T:R[i] = 1if sum(R[1: len(T) + 1]) == len(T):D[T] = 0continuefor i in range(1, max(T) + 1):if R[i] == 0: continuefor j in range(i - 1, -1, -1):if R[j] == 0: breakif j == 0: continueR[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:continueelif D[T] == -1: #帰りがけの処理X = set()for nT in E[T]:assert D[nT] >= 0X.add(D[nT])for i in range(10 ** 7):if i not in X:D[T] = ibreakreturn D[tuple(sorted(S))]#規則性しかない 適当にエスパーする#x: これより左側にある値の個数def esper(Lt, Rt, x = 0):d = Rt - Lt + 1return 0 if (Lt - x) & 1 == 1 else ddef 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 0if back >= maxN - 1: breakLt = randint(back + 1, maxN - 1)Rt = randint(Lt + 1, maxN)P.append(Lt)P.append(Rt)assert len(P) > 0 and len(P) & 1 == 0Q = []for i in range(len(P) // 2):Q.append((P[i << 1], P[i << 1 | 1]))return Qdef solve(P):#圧縮bL, bR = P[0]Q = []for i in range(1, len(P)):Lt, Rt = P[i]if bR + 1 == Lt:bR = Rtcontinueelse:Q.append((bL, bR))bL, bR = Lt, RtQ.append((bL, bR))ans = 0cnt = 0for Lt, Rt in Q:ans ^= esper(Lt, Rt, cnt)cnt += Rt - Lt + 1return 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')