結果
問題 |
No.3283 Labyrinth and Friends
|
ユーザー |
|
提出日時 | 2025-09-26 22:23:08 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,002 bytes |
コンパイル時間 | 2,119 ms |
コンパイル使用メモリ | 207,136 KB |
実行使用メモリ | 34,944 KB |
最終ジャッジ日時 | 2025-09-26 22:23:15 |
合計ジャッジ時間 | 7,118 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | WA * 1 RE * 1 |
other | WA * 18 RE * 27 |
ソースコード
#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[i]; 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[u][j]); } } for (int i = siz[u] + siz[v] - 1; 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; }