結果

問題 No.19 ステージの選択
ユーザー ytftytft
提出日時 2022-11-03 09:45:21
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 36 ms / 5,000 ms
コード長 1,335 bytes
コンパイル時間 232 ms
コンパイル使用メモリ 82,376 KB
実行使用メモリ 54,580 KB
最終ジャッジ日時 2024-07-17 20:08:44
合計ジャッジ時間 1,948 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 36 ms
52,744 KB
testcase_01 AC 35 ms
53,260 KB
testcase_02 AC 34 ms
53,324 KB
testcase_03 AC 34 ms
53,416 KB
testcase_04 AC 33 ms
54,580 KB
testcase_05 AC 36 ms
54,556 KB
testcase_06 AC 33 ms
54,516 KB
testcase_07 AC 34 ms
52,884 KB
testcase_08 AC 35 ms
53,188 KB
testcase_09 AC 35 ms
53,788 KB
testcase_10 AC 33 ms
53,472 KB
testcase_11 AC 34 ms
54,280 KB
testcase_12 AC 33 ms
53,544 KB
testcase_13 AC 32 ms
53,552 KB
testcase_14 AC 34 ms
54,000 KB
testcase_15 AC 34 ms
53,272 KB
testcase_16 AC 35 ms
53,484 KB
testcase_17 AC 34 ms
53,076 KB
testcase_18 AC 33 ms
53,600 KB
testcase_19 AC 34 ms
53,828 KB
testcase_20 AC 36 ms
54,208 KB
testcase_21 AC 34 ms
53,056 KB
testcase_22 AC 34 ms
53,004 KB
testcase_23 AC 35 ms
53,732 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
input=lambda:sys.stdin.readline().rstrip()
class unionFind:
    def __init__(self,N):
        self.N=N
        self.parent=[-1 for i in range(N)]
        self.size=[1 for i in range(N)]
    def find(self,x):
        path=[x]
        while self.parent[path[-1]]!=-1:
            path.append(self.parent[path[-1]])
        for i in path[:-1]:
            self.parent[i]=path[-1]
        return path[-1]
    def unite(self,x,y):
        roots=sorted([self.find(x),self.find(y)],key=lambda _:self.parent[_])
        if roots[0]!=roots[1]:
            self.parent[roots[0]]=roots[1]
            self.size[roots[1]]+=self.size[roots[0]]
N=int(input())
diff=[0 for i in range(N)]
nex=[0 for i in range(N)]
prev=[0 for i in range(N)]
rem=[1 for i in range(N)]
ans=0
m={}
u=unionFind(N)
for i in range(N):
	diff[i],prev[i]=map(int,input().split())
	prev[i]-=1
	nex[prev[i]]+=1
	u.unite(i,prev[i])
erase=[]
for i in range(N):
	if nex[i]==0:
		erase.append(i)
while len(erase):
	temp=erase[-1]
	erase.pop()
	if rem[temp]==0:
		continue
	ans+=diff[temp]/2
	nex[prev[temp]]-=1
	rem[temp]=0
	if nex[prev[temp]]==0:
		erase.append(prev[temp])
for i in range(N):
	if rem[i]:
		ans+=diff[i]/2
		if not u.find(i) in m:
			m[u.find(i)]=float('inf')
		m[u.find(i)]=min(m[u.find(i)],diff[i])
for i in m:
	ans+=m[i]/2
print('{:.1f}'.format(ans))
0