結果

問題 No.3148 Min-Cost Destruction of Parentheses
ユーザー titia
提出日時 2025-06-28 03:26:53
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 1,797 bytes
コンパイル時間 384 ms
コンパイル使用メモリ 82,576 KB
実行使用メモリ 125,320 KB
最終ジャッジ日時 2025-06-28 03:27:25
合計ジャッジ時間 24,969 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 4 WA * 27
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
input = sys.stdin.readline

N=int(input())
S=input().strip()
A=list(map(int,input().split()))

Q=[]
count=1
Parent=[-1]*(N+1)

for s in S:
    #print(Q)
    if s=="(":
        Q.append(count)
        count+=1
    else:
        x=Q.pop()
        if Q:
            Parent[x]=Q[-1]
        else:
            Parent[x]=0

#print(Parent)

from heapq import heappop,heappush

# UnionFind

def find(x):
    while Group[x] != x:
        x=Group[x]
    return x

def Union(x,y):
    if find(x) != find(y):
        if Nodes[find(x)] < Nodes[find(y)]:
            
            Nodes[find(y)] += Nodes[find(x)]
            Nodes[find(x)] = 0
            Group[find(x)] = find(y)
            
        else:
            Nodes[find(x)] += Nodes[find(y)]
            Nodes[find(y)] = 0
            Group[find(y)] = find(x)


Group = [i for i in range(N+1)] # グループ分け
Nodes = [1]*(N+1) # 各グループのノードの数

NOW=[[] for i in range(N+1)]

H=[]

for i in range(N):
    NOW[i+1]=[A[i],1]
    heappush(H,(-A[i],A[i],1,i+1))
ANS=0

#print(H)

while H:
    ave,SUM,ko,ind=heappop(H)

    if find(ind)!=ind:
        continue
    if NOW[ind]!=[SUM,ko]:
        continue

    pa=find(Parent[find(ind)])

    if pa!=0 and NOW[pa][0]*ko<=SUM*NOW[pa][1]:
        SUM2,ko2=NOW[pa]
        pa2=find(Parent[pa])

        Union(ind,pa)

        NOW[find(ind)]=[SUM+SUM2,ko+ko2]
        heappush(H,(-(SUM+SUM2)/(ko+ko2),SUM+SUM2,ko+ko2,find(ind)))
        #print(SUM,SUM2,ko,ko2)
        ANS+=SUM*ko2
        Parent[find(ind)]=pa2

ALL=[]
for i in range(1,N+1):
    if find(i)==i:
        heappush(ALL,(-NOW[i][0]/NOW[i][1],NOW[i][0],NOW[i][1]))

#print(ALL)

ANS=0
now=0
while ALL:
    SS,S,ko=heappop(ALL)
    ANS+=S*(now+ko)
    now+=ko

print(ANS)
 

            
            

          

0