結果
| 問題 | 
                            No.3283 Labyrinth and Friends
                             | 
                    
| コンテスト | |
| ユーザー | 
                             tau1235
                         | 
                    
| 提出日時 | 2025-09-26 22:33:22 | 
| 言語 | C++23  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                WA
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 840 bytes | 
| コンパイル時間 | 3,262 ms | 
| コンパイル使用メモリ | 286,248 KB | 
| 実行使用メモリ | 34,688 KB | 
| 最終ジャッジ日時 | 2025-09-26 22:33:28 | 
| 合計ジャッジ時間 | 5,544 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge5 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| 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];
    }
    dp[v][0]=0;
  };
  dfs(dfs,0,-1);
  cout<<dp[0][x]<<endl;
}
            
            
            
        
            
tau1235