結果
問題 |
No.3283 Labyrinth and Friends
|
ユーザー |
|
提出日時 | 2025-09-26 22:28:05 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,002 bytes |
コンパイル時間 | 1,971 ms |
コンパイル使用メモリ | 207,376 KB |
実行使用メモリ | 34,816 KB |
最終ジャッジ日時 | 2025-09-26 22:28:10 |
合計ジャッジ時間 | 3,745 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | WA * 2 |
other | AC * 1 WA * 44 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; int main () { int N, X; cin >> N >>X; std::vector<int> P(N); for (int i = 1; i < N; i ++) { cin >> P[i]; P[i] --; } P[0] = -1; vector<vector<int>> gr(N); for (int i = 1; i < N; i ++) { gr[P[i]].push_back(i); } vector<int> C(N, 0), S(N, 0); for (int i = 1; i < N; i ++) { cin >> C[i] >> S[i]; } int ss = accumulate(S.begin(), S.end(), 0); vector dp(N, vector(ss + 1, (ll)1e18)); vector siz(N, 0); vector<ll> nxt; for (int u = N-1; u >= 0; u --) { dp[u][0] = 0; for (int i = 1; i <= S[u]; i ++) dp[u][i] = C[u]; siz[u] = S[u] + 1; nxt = dp[u]; for (int v : gr[u]) { for (int i = S[u]; i < siz[u]; i ++) { for (int j = S[v]; j < siz[v]; j ++) { nxt[i + j] = min(nxt[i + j], dp[u][i] + dp[v][j]); } } for (int i = siz[u] + siz[v] - 2; i >= 0; i --) { nxt[i] = min(nxt[i], nxt[i+1]); } swap(dp[u], nxt); siz[u] = siz[u] + siz[v] - 1; } } cout << dp[0][X] << endl; }