結果
問題 | No.3148 Min-Cost Destruction of Parentheses |
ユーザー |
![]() |
提出日時 | 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 |
ソースコード
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)