結果
問題 |
No.3283 Labyrinth and Friends
|
ユーザー |
|
提出日時 | 2025-09-27 15:18:02 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,681 bytes |
コンパイル時間 | 1,905 ms |
コンパイル使用メモリ | 204,848 KB |
実行使用メモリ | 49,568 KB |
最終ジャッジ日時 | 2025-09-27 15:18:06 |
合計ジャッジ時間 | 4,069 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 29 WA * 16 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:52:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 52 | scanf("%d", &a); | ~~~~~^~~~~~~~~~ main.cpp:55:42: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 55 | for (int i = 2; i < n + 1; i++) scanf("%d%d", w + i, v + i); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; typedef long long ll; const int N = 2000086, MOD = 998244353;//, INF = 0x3f3f3f3f; const ll INF = 0x3f3f3f3f3f3f3f3f; int n, m, w[N]; int e[N], ne[N], h[N], idx, v[N], s[N]; void add(int a, int b) { e[idx] = b, ne[idx] = h[a], h[a] = idx++; } ll f[2086][2086]; void dfs(int r) { s[r] = v[r]; memset(f[r], 0x3f, sizeof f[r]); f[r][v[r]] = w[r]; vector<pii> son; for (int i = h[r]; ~i; i = ne[i]) { int j = e[i]; dfs(j); s[r] += s[j]; son.push_back({-s[j], j}); } if (!son.size()) return; sort(son.begin(), son.end()); swap(f[son.front().second], f[r]); f[r][m] = min(INF, f[r][m] + w[r]); for (int i = max(0, m - v[r]); i < m; i++) f[r][m] = min(f[r][m], f[r][i] + w[r]); for (int i = m - 1; i >= v[r]; i--) f[r][i] = f[r][i - v[r]] == INF ? INF : f[r][i - v[r]] + w[r]; for (int i = 0; i < v[r]; i++) f[r][i] = INF; f[r][v[r]] = w[r]; for (int i = 1; i < son.size(); i++) { int x = son[i].second; vector<ll> t(m + 1); for (int j = 0; j < m + 1; j++) t[j] = f[r][j]; for (int j = 0; j <= min(m, s[x]); j++) if (f[x][j] != INF) for (int k = 0; k <= min(m, s[r]); k++) f[r][min(m, k + j)] = min(f[r][min(m, k + j)], f[x][j] + t[k]); } } int main() { cin >> n >> m; memset(h, -1, sizeof(int) * (n + 10)); for (int i = 2, a; i < n + 1; i++) { scanf("%d", &a); add(a, i); } for (int i = 2; i < n + 1; i++) scanf("%d%d", w + i, v + i); dfs(1); printf("%lld\n", f[1][m]); return 0; }