結果
| 問題 |
No.973 余興
|
| コンテスト | |
| ユーザー |
mkawa2
|
| 提出日時 | 2020-01-18 12:40:46 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 2,270 bytes |
| コンパイル時間 | 196 ms |
| コンパイル使用メモリ | 12,672 KB |
| 実行使用メモリ | 1,000,332 KB |
| 最終ジャッジ日時 | 2024-06-27 06:29:04 |
| 合計ジャッジ時間 | 10,792 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 2 |
| other | MLE * 1 -- * 53 |
ソースコード
import sys
sys.setrecursionlimit(10 ** 6)
int1 = lambda x: int(x) - 1
p2D = lambda x: print(*x, sep="\n")
def II(): return int(sys.stdin.readline())
def MI(): return map(int, sys.stdin.readline().split())
def LI(): return list(map(int, sys.stdin.readline().split()))
def LLI(rows_number): return [LI() for _ in range(rows_number)]
def main():
n, x = MI()
aa = LI()
# 閉区間[l,r]が残っている状態で手順が来たとき、勝てるかどうかをDPする
# lが現在の位置からどこまで移動できるかを事前計算する
lto = [0] * n
to = -1
s = 0
for l in range(n):
while to < n - 1 and s <= x:
to += 1
s += aa[to]
lto[l] = to
s -= aa[l]
# print(lto)
# rが現在の位置からどこまで移動できるかを事前計算する
rto = [0] * n
to = n
s = 0
for r in range(n - 1, -1, -1):
while to > 0 and s <= x:
to -= 1
s += aa[to]
rto[r] = to
s -= aa[r]
# print(rto)
# l<rを守ったうえで、lは大きい方から、rは小さい方からDP[l][r]を更新
# 遷移先に1つでも負け(0)があれば勝ち(1)、そうでなければ(すべて1なら)負け(0)
# ただし、遷移先が複数あり、愚直にやるとTLEするので
# lとr別々に累積和の表を持って、0の遷移先があるか判断する
dpl = {(i,i):0 for i in range(n)}
dpr = {(i,i):0 for i in range(n)}
win = 0
for l in range(n - 2, -1, -1):
for r in range(l + 1, n):
win = 0
# l=r(残り1つの状態)に遷移できれば勝ちで確定
# (和<遷移先のマスの数)ならば、どこかのマスは0なので勝ち
# lを動かすとき
nl = lto[l] # 最遠の遷移先
if nl >= r or dpl[l + 1, r] - dpl[nl + 1, r] < nl - l: win = 1
# rを動かすとき
nr = rto[r] # 最遠の遷移先
if nr <= l or dpr[l, r - 1] - dpr[l, nr - 1] < r - nr: win = 1
# 表を更新
dpl[l, r] = dpl[l + 1, r] + win
dpr[l, r] = dpr[l, r - 1] + win
if win:
print("A")
else:
print("B")
main()
mkawa2