結果
| 問題 | No.684 Prefix Parenthesis |
| コンテスト | |
| ユーザー |
qwewe
|
| 提出日時 | 2025-05-14 13:21:28 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 268 ms / 2,000 ms |
| コード長 | 2,733 bytes |
| コンパイル時間 | 164 ms |
| コンパイル使用メモリ | 82,236 KB |
| 実行使用メモリ | 125,872 KB |
| 最終ジャッジ日時 | 2025-05-14 13:23:53 |
| 合計ジャッジ時間 | 6,039 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 31 |
ソースコード
import sys
def solve():
N = int(sys.stdin.readline())
S_char_list = sys.stdin.readline().strip()
s_params_list = []
running_balance = 0
# min_balance_in_prefix_scan: min balance encountered while scanning S_str[0...j]
# this value is relative to balance 0 at the start of S_str[0...j]
min_balance_in_prefix_scan = 0
running_num_close = 0
for j in range(N): # For prefix S_str[0...j], which is S_{j+1}
char_s_j = S_char_list[j]
if char_s_j == '(':
running_balance += 1
else: # char_s_j == ')'
running_balance -= 1
running_num_close += 1
# min_balance_in_prefix_scan should be the minimum balance encountered
# if we scanned S_str[0...j] starting from balance 0.
# The running_balance tracks sum of (+1 for '(', -1 for ')').
# min_balance_in_prefix_scan tracks min value of this sum over current prefix.
min_balance_in_prefix_scan = min(min_balance_in_prefix_scan, running_balance)
# Parameters for S_{j+1} = S_str[0...j]
final_bal_val = running_balance
# c_k = max(0, -min_balance_of_Sk_starting_from_0)
# min_balance_in_prefix_scan is min( B[0], B[1], ..., B[j] ) where B are prefix sums
# We need min(0, B[0], ..., B[j]) for c_k calculation.
# Example: S_k = "((", min_balance_in_prefix_scan might be 1 (if S_str starts with '(').
# But for "((", c=0. If S_k="))((" min_balance_in_prefix_scan could be -2.
# The current running_min_balance is correct for definition of min_balance_in_Sk.
c_val = max(0, -min_balance_in_prefix_scan)
p_val = final_bal_val + c_val
m_val = running_num_close - c_val
s_params_list.append({'c': c_val, 'm': m_val, 'p': p_val})
list_1 = [] # p_i >= c_i
list_2 = [] # p_i < c_i
for params in s_params_list:
if params['p'] >= params['c']:
list_1.append(params)
else:
list_2.append(params)
# Sort list_1: by c_i ASC, then p_i DESC
list_1.sort(key=lambda x: (x['c'], -x['p']))
# Sort list_2: by p_i DESC, then c_i ASC
list_2.sort(key=lambda x: (-x['p'], x['c']))
sorted_full_list = list_1 + list_2
total_pairs = 0
current_open_brackets_count = 0
for params in sorted_full_list:
c = params['c']
m = params['m']
p = params['p']
can_satisfy_c = min(c, current_open_brackets_count)
total_pairs += m + can_satisfy_c
current_open_brackets_count = current_open_brackets_count - can_satisfy_c + p
sys.stdout.write(str(total_pairs * 2) + "\n")
solve()
qwewe