結果

問題 No.3283 Labyrinth and Friends
コンテスト
ユーザー 回転
提出日時 2026-08-20 20:59:30
言語 PyPy3
(7.3.17)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
AC  
実行時間 1,789 ms / 2,000 ms
+ 643µs
コード長 824 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 325 ms
コンパイル使用メモリ 95,980 KB
実行使用メモリ 85,720 KB
最終ジャッジ日時 2026-08-20 20:59:42
合計ジャッジ時間 10,037 ms
ジャッジサーバーID
(参考情報)
judge2_0 / judge1_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 45
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

import pypyjit
pypyjit.set_param("max_unroll_recursion=-1")
import sys
sys.setrecursionlimit(10**4)
N,X = list(map(int,input().split()))
P = [-1] + list(map(lambda x:int(x)-1,input().split()))
edge = [[] for _ in range(N)]
for i in range(1,N):
    edge[i].append(P[i])
    edge[P[i]].append(i)

points = [(0,0)]
for _ in range(1,N):
    c,s = list(map(int,input().split()))
    points.append((c,s))

INF = 1<<60
def dfs(n,pre):
    ret = [INF] * (X+1)
    ret[X] = 0
    c,s = points[n]
    ret[max(0, X-s)] = 0
    for i in edge[n]:
        if(i == pre):continue
        child = dfs(i, n)
        for j in range(X+1):
            if(ret[j] == INF):continue
            for k in range(X+1):
                ret[max(0,j-(X-k))] = min(ret[max(0,j-(X-k))], ret[j] + child[k] + points[i][0])

    return ret

print(dfs(0,-1)[0])
0