結果
| 問題 |
No.2521 Don't be Same
|
| コンテスト | |
| ユーザー |
navel_tos
|
| 提出日時 | 2023-10-28 01:50:56 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 1,549 bytes |
| コンパイル時間 | 184 ms |
| コンパイル使用メモリ | 82,480 KB |
| 実行使用メモリ | 84,204 KB |
| 平均クエリ数 | 10.21 |
| 最終ジャッジ日時 | 2024-09-25 15:55:49 |
| 合計ジャッジ時間 | 5,497 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | RE * 1 |
| other | AC * 12 RE * 15 |
ソースコード
#yukicoder410G Dont be Same
#愚直解を作成する。0~N個の石ではじまる場合のmexを求める(mex>0なら先手必勝)
def simple(N):
DP=[[-1]*(N+1) for _ in range(N+1)]
HS,WS=[[set() for _ in range(N+1)] for _ in range(2)] #行と列のセット
for h in range(N+1):
DP[h][0]=h; WS[0].add(h); HS[h].add(h)
for w in range(1,N+1):
check=HS[h]|WS[w]
if h==w: check|=set([DP[i][i] for i in range(h)])
for i in range(10**10):
if i not in check: DP[h][w]=i; break
HS[h].add(DP[h][w]); WS[w].add(DP[h][w])
return [(h,w) for h in range(N+1) for w in range(N+1) if DP[h][w]==0]
#実験すると、小さい方が奇数 かつ もう片方は+1 の場合のみ先手必敗とわかる
#ジャッジに必敗形を押しつけるゲームを楽しめばよさそうだ
def recieve(text,X,Y):
if text[0]=='A':
_,i,x=text.split(); i=int(i); x=int(x)
return (X-x,Y) if i==1 else (X,Y-x)
if text[0]=='B': return (0,0)
else: exit()
X,Y=map(int,input().split())
if (X+1==Y and X%2) or (X==Y+1 and Y%2):
print('Second'); X,Y=recieve(input(),X,Y)
else: print('First')
#必敗形を押しつける
while 1:
if X==Y: print('B'); X=Y=0; exit()
elif X<Y:
if X%2: diff=Y-X-1; Y-=diff; print('A 2',diff)
else: diff=Y-X+1; Y-=diff; print('A 2',diff)
else:
if Y%2: diff=X-Y-1; X-=diff; print('A 1',diff)
else: diff=X-Y+1; X-=diff; print('A 1',diff)
X,Y=recieve(input(),X,Y)
navel_tos