結果
問題 |
No.973 余興
|
ユーザー |
![]() |
提出日時 | 2025-06-12 13:23:14 |
言語 | PyPy3 (7.3.15) |
結果 |
MLE
|
実行時間 | - |
コード長 | 2,270 bytes |
コンパイル時間 | 171 ms |
コンパイル使用メモリ | 82,656 KB |
実行使用メモリ | 849,276 KB |
最終ジャッジ日時 | 2025-06-12 13:27:48 |
合計ジャッジ時間 | 10,358 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | -- * 2 |
other | MLE * 1 -- * 53 |
ソースコード
import sys sys.setrecursionlimit(1 << 25) def main(): n, X = map(int, sys.stdin.readline().split()) a = list(map(int, sys.stdin.readline().split())) n = len(a) prefix = [0] * (n + 1) for i in range(n): prefix[i+1] = prefix[i] + a[i] suffix = [0] * (n + 2) for i in range(n-1, -1, -1): suffix[i+1] = suffix[i+2] + a[i] memo = [[[-1 for _ in range(2)] for __ in range(n)] for ___ in range(n)] def dfs(left, right, turn): if left > right: return True # Current player wins as the opponent took the last if memo[left][right][turn] != -1: return memo[left][right][turn] can_win = False # Left side low, high = 1, right - left + 1 max_k = 0 while low <= high: mid = (low + high) // 2 total = prefix[left + mid] - prefix[left] if total <= X: max_k = mid low = mid + 1 else: high = mid - 1 if max_k > 0: new_left = left + max_k res = dfs(new_left, right, 1 - turn) if not res: can_win = True if not can_win and max_k > 0: new_left = left + 1 res = dfs(new_left, right, 1 - turn) if not res: can_win = True # Right side low, high = 1, right - left + 1 max_m = 0 while low <= high: mid = (low + high) // 2 total = suffix[right - mid + 1] - suffix[right + 1] if total <= X: max_m = mid low = mid + 1 else: high = mid - 1 if max_m > 0 and not can_win: new_right = right - max_m res = dfs(left, new_right, 1 - turn) if not res: can_win = True if max_m > 0 and not can_win: new_right = right - 1 res = dfs(left, new_right, 1 - turn) if not res: can_win = True memo[left][right][turn] = can_win return can_win result = dfs(0, n-1, 0) print("A" if result else "B") if __name__ == "__main__": main()