結果
| 問題 | No.1778 括弧列クエリ / Bracketed Sequence Query |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-11-05 02:28:32 |
| 言語 | PyPy3 (8.0.1 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 477 ms / 2,000 ms |
| + 759µs | |
| コード長 | 2,042 bytes |
| 記録 | |
| コンパイル時間 | 107 ms |
| コンパイル使用メモリ | 64,660 KB |
| 実行使用メモリ | 123,072 KB |
| 最終ジャッジ日時 | 2026-11-05 02:29:04 |
| 合計ジャッジ時間 | 14,842 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 28 |
ソースコード
## https://yukicoder.me/problems/no/1778
from collections import deque
def main():
N, Q = map(int, input().split())
S = input()
xy = []
for _ in range(Q):
x, y = map(int, input().split())
xy.append((x, y))
# 木を構成する
in_map = {0:-1}
out_map = {}
k = 0
parents = {0:-1}
depth = {0: 0}
for i in range(N):
s = S[i]
if s == "(":
in_map[i + 1] = -1
parents[i + 1] = k
depth[i + 1] = depth[k] + 1
k = i + 1
else:
in_map[k] = i + 1
out_map[i + 1] = k
k = parents[k]
# parents_list =
k = 0
while (1 << k) < N:
k += 1
max_k = k
parents_list = [[-1] * N for _ in range(max_k + 1)]
for c, p in parents.items():
parents_list[0][c] = p
for k in range(1, max_k + 1):
for i in range(N):
p = parents_list[k - 1][i]
if p != -1:
parents_list[k][i] = parents_list[k - 1][p]
for x, y in xy:
if x in out_map:
x = out_map[x]
if y in out_map:
y = out_map[y]
d_x = depth[x]
d_y = depth[y]
if d_x > d_y:
x, y, d_x, d_y = y, x, d_y, d_x
# d_x <= d_yを仮定する
if d_x < d_y:
for k in reversed(range(max_k + 1)):
if d_y - (1 << k) >= d_x and parents_list[k][y] != -1:
y = parents_list[k][y]
d_y -= (1 << k)
if x == y:
answer= x
else:
d = d_x
for k in reversed(range(max_k + 1)):
if d >= (1 << k) and parents_list[k][x] != parents_list[k][y]:
x = parents_list[k][x]
y = parents_list[k][y]
d -= (1 << k)
answer = parents_list[0][x]
if answer == 0:
print(-1)
else:
print(answer, in_map[answer])
if __name__ == "__main__":
main()