結果
問題 | No.3144 Parentheses Modification and Rotation (01 Ver.) |
ユーザー |
![]() |
提出日時 | 2025-05-16 22:59:57 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 190 ms / 2,000 ms |
コード長 | 2,986 bytes |
コンパイル時間 | 511 ms |
コンパイル使用メモリ | 82,228 KB |
実行使用メモリ | 84,560 KB |
最終ジャッジ日時 | 2025-06-26 18:03:19 |
合計ジャッジ時間 | 6,450 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 39 |
ソースコード
def op(x, y): return min(x, y) class SegTree: def __init__(self, init_val, op, ide_ele): n = len(init_val) self.n = n self.op = op self.ide_ele = ide_ele self.num = 1 << (n - 1).bit_length() self.tree = [ide_ele] * 2 * self.num for i in range(n): self.tree[self.num + i] = init_val[i] for i in range(self.num - 1, 0, -1): self.tree[i] = self.op(self.tree[2 * i], self.tree[2 * i + 1]) def update(self, k, x): k += self.num self.tree[k] = x while k > 1: self.tree[k >> 1] = self.op(self.tree[k], self.tree[k ^ 1]) k >>= 1 def query(self, l, r): res = self.ide_ele l += self.num r += self.num while l < r: if l & 1: res = self.op(res, self.tree[l]) l += 1 if r & 1: res = self.op(res, self.tree[r - 1]) l >>= 1 r >>= 1 return res def __getitem__(self, n): return self.tree[self.num+n] def List(self): return self.tree[self.num:self.num+self.n] def max_right(self, l, f, limit): if l == self.n: return self.n l += self.num sm = self.ide_ele while True: while l%2 == 0: l >>= 1 if not f(self.op(sm, self.tree[l]), limit): while l < self.num: l <<= 1 if f(self.op(sm, self.tree[l]), limit): sm = self.op(sm, self.tree[l]) l += 1 return l-self.num sm = self.op(sm, self.tree[l]) l += 1 if l & -l == l: break return self.n def min_left(self, r, f, limit): if r == 0: return 0 r += self.num sm = self.ide_ele while True: r -= 1 while r > 1 and r%2 == 1: r >>= 1 if not f(self.op(self.tree[r], sm), limit): while r < self.num: r = 2*r+1 if f(self.op(self.tree[r], sm), limit): sm = self.op(self.tree[r], sm) r -= 1 return r+1-self.num sm = self.op(self.tree[r], sm) if r & -r == r: break return 0 INF = 1<<60 N = int(input()) S = input() _, _ = map(int, input().split()) if N%2 == 1: exit(print(-1)) cum = [0] for s in S: if s == "(": cum.append(cum[-1]+1) else: cum.append(cum[-1]-1) seg = SegTree(cum, op, INF) ans = INF for i in range(N): SUM = (cum[-1]-cum[i])+(cum[i]) MIN = seg.query(i+1, N+1)-cum[i] MIN = min(MIN, cum[-1]-cum[i]+seg.query(0, i+1)) cnt = 0 if MIN < 0: cnt -= MIN//2 SUM -= MIN cnt += abs(SUM)//2 ans = min(ans, cnt) print(ans)