結果
問題 | No.1778 括弧列クエリ / Bracketed Sequence Query |
ユーザー |
![]() |
提出日時 | 2025-04-15 23:54:52 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 980 ms / 2,000 ms |
コード長 | 2,282 bytes |
コンパイル時間 | 321 ms |
コンパイル使用メモリ | 82,044 KB |
実行使用メモリ | 144,068 KB |
最終ジャッジ日時 | 2025-04-15 23:56:21 |
合計ジャッジ時間 | 18,613 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 27 |
ソースコード
import bisect class SegmentTreeNode: def __init__(self, l, r): self.l = l self.r = r self.left = None self.right = None self.max_j = 0 def build(l, r, j_values): node = SegmentTreeNode(l, r) if l == r: node.max_j = j_values[l] else: mid = (l + r) // 2 node.left = build(l, mid, j_values) node.right = build(mid + 1, r, j_values) node.max_j = max(node.left.max_j, node.right.max_j) return node def query_max(node, L, R, target): if node.r < L or node.l > R: return -1 if node.max_j < target: return -1 if node.l == node.r: return node.l res = query_max(node.right, L, R, target) if res != -1: return res return query_max(node.left, L, R, target) def main(): import sys input = sys.stdin.read data = input().split() ptr = 0 N = int(data[ptr]) ptr += 1 Q = int(data[ptr]) ptr += 1 S = data[ptr] ptr += 1 match = [0] * (N + 2) stack = [] for i in range(1, N + 1): if S[i - 1] == '(': stack.append(i) else: if stack: left = stack.pop() match[left] = i match[i] = left left_brackets = [] for i in range(1, N + 1): if S[i - 1] == '(': left_brackets.append(i) if not left_brackets: for _ in range(Q): print(-1) return j_values = [match[i] for i in left_brackets] root = build(0, len(left_brackets) - 1, j_values) output = [] for _ in range(Q): x = int(data[ptr]) ptr += 1 y = int(data[ptr]) ptr += 1 mx = match[x] my = match[y] positions = [x, mx, y, my] min_pos = min(positions) max_pos = max(positions) pos = bisect.bisect_right(left_brackets, min_pos) - 1 if pos < 0: output.append("-1") continue k = query_max(root, 0, pos, max_pos) if k == -1: output.append("-1") else: ans_i = left_brackets[k] ans_j = j_values[k] output.append(f"{ans_i} {ans_j}") print('\n'.join(output)) if __name__ == "__main__": main()