結果
問題 |
No.3144 Parentheses Modification and Rotation (01 Ver.)
|
ユーザー |
![]() |
提出日時 | 2025-03-27 15:29:01 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,838 bytes |
コンパイル時間 | 293 ms |
コンパイル使用メモリ | 12,288 KB |
実行使用メモリ | 20,352 KB |
最終ジャッジ日時 | 2025-03-27 15:29:07 |
合計ジャッジ時間 | 5,760 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 WA * 1 |
other | AC * 23 WA * 16 |
ソースコード
from collections import deque import sys def solve(): N = int(input()) S = input() # N が奇数なら有効な括弧列にはならない if N % 2 == 1: print(-1) return # A[i] = 1 if S[i]=='(', -1 if S[i]==')' A = [1 if ch=='(' else -1 for ch in S] # 累積和 C[0...2N] (S を 2 回連結した形) C = [0]*(2*N+1) for i in range(2*N): C[i+1] = C[i] + A[i % N] diff = C[N] # S の合計 # 全体の不均衡修正は常に |diff|/2 cost_imbalance = abs(diff) // 2 # スライディングウィンドウ(区間サイズ = N+1)で C[r...r+N] の最小値を求める # ここでは r=0,...,N-1 について求める window_size = N + 1 deq = deque() min_in_window = [0]*(2*N+1) # 最初のウィンドウ:インデックス 0 から window_size-1 for i in range(window_size): while deq and C[deq[-1]] >= C[i]: deq.pop() deq.append(i) min_in_window[0] = C[deq[0]] # i はウィンドウの左端 (r) # ウィンドウは [i, i+N] for r in range(1, N): # deq の先頭がウィンドウ外なら pop する while deq and deq[0] < r: deq.popleft() # 新しくウィンドウに入る要素のインデックス: r+N new_index = r + N while deq and C[deq[-1]] >= C[new_index]: deq.pop() deq.append(new_index) min_in_window[r] = C[deq[0]] # 各回転 r に対して候補コストを計算 # cost(r) = cost_imbalance + max(0, C[r] - (min_{j in [r, r+N]} C[j])) best = float('inf') for r in range(N): candidate = cost_imbalance + max(0, C[r] - min_in_window[r]) best = min(best, candidate) print(best) if __name__ == '__main__': solve()