結果
| 問題 | No.3503 Brackets Stack Query 2 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-18 00:58:50 |
| 言語 | Python3 (3.14.3 + numpy 2.4.4 + scipy 1.17.1) |
| 結果 |
AC
|
| 実行時間 | 776 ms / 2,000 ms |
| コード長 | 1,839 bytes |
| 記録 | |
| コンパイル時間 | 580 ms |
| コンパイル使用メモリ | 20,960 KB |
| 実行使用メモリ | 63,584 KB |
| 最終ジャッジ日時 | 2026-04-18 00:59:21 |
| 合計ジャッジ時間 | 23,880 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 30 |
ソースコード
import sys
input = sys.stdin.readline
Q = int(input())
# 可持久化栈结点
# 结点 0 表示空栈
stage = [0] # stage[i] = 0 / 1
nxt = [0] # nxt[i] = 下一个结点编号
# 当前字符串每个长度对应的状态
# tops[-1] / oks[-1] 就是当前 S 的状态
tops = [0] # 栈顶结点编号
oks = [True] # 当前前缀是否仍然可能合法
ans = []
for _ in range(Q):
q = input().split()
if q[0] == '1':
c = q[1]
top = tops[-1]
ok = oks[-1]
if not ok:
# 已经错了,继续追加也不可能恢复
tops.append(top)
oks.append(False)
else:
if c == '(':
# 压入阶段 0
stage.append(0)
nxt.append(top)
tops.append(len(stage) - 1)
oks.append(True)
elif c == '|':
# 栈顶必须是阶段 0
if top == 0 or stage[top] == 1:
tops.append(top)
oks.append(False)
else:
# 把栈顶从 0 变成 1(持久化做法:新建一个点)
stage.append(1)
nxt.append(nxt[top])
tops.append(len(stage) - 1)
oks.append(True)
else: # c == ')'
# 栈顶必须是阶段 1
if top == 0 or stage[top] == 0:
tops.append(top)
oks.append(False)
else:
# 弹栈
tops.append(nxt[top])
oks.append(True)
else:
# 删除末尾字符:直接回退一个状态
tops.pop()
oks.pop()
ans.append("Yes" if oks[-1] and tops[-1] == 0 else "No")
print("\n".join(ans))