結果
問題 |
No.3283 Labyrinth and Friends
|
ユーザー |
![]() |
提出日時 | 2025-09-26 22:44:25 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 824 bytes |
コンパイル時間 | 3,231 ms |
コンパイル使用メモリ | 286,260 KB |
実行使用メモリ | 34,560 KB |
最終ジャッジ日時 | 2025-09-26 22:44:35 |
合計ジャッジ時間 | 5,087 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 22 WA * 23 |
ソースコード
#include<bits/stdc++.h> using namespace std; int main(){ using ll=long long; ll inf=1e18; int n,x; cin>>n>>x; vector<vector<int>> g(n); vector<ll> c(n),s(n); for (int i=1;i<n;i++){ int p; cin>>p; p--; g[p].push_back(i); } int m=0; for (int i=1;i<n;i++){ cin>>c[i]>>s[i]; m+=s[i]; } vector<int> sum(n); vector<vector<ll>> dp(n,vector<ll>(m+1,inf)); auto dfs=[&](auto dfs,int v,int par)-> void { dp[v][s[v]]=c[v]; sum[v]+=s[v]; for (int u:g[v]){ dfs(dfs,u,v); auto next=dp[v]; for (int i=0;i<=sum[v];i++){ for (int j=0;j<=sum[u];j++){ if (i+j>m) break; next[i+j]=min(next[i+j],dp[v][i]+dp[u][j]); } } swap(next,dp[v]); sum[v]+=sum[u]; } }; dfs(dfs,0,-1); cout<<dp[0][x]<<endl; }