結果
問題 |
No.1154 シュークリームゲーム(Hard)
|
ユーザー |
|
提出日時 | 2025-07-12 17:25:45 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 1,317 bytes |
コンパイル時間 | 1,923 ms |
コンパイル使用メモリ | 194,204 KB |
実行使用メモリ | 6,272 KB |
最終ジャッジ日時 | 2025-07-12 17:25:54 |
合計ジャッジ時間 | 7,746 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 5 RE * 35 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:53:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 53 | scanf("%d", &n); | ~~~~~^~~~~~~~~~ main.cpp:55:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 55 | scanf("%d", &a[i]); | ~~~~~^~~~~~~~~~~~~ main.cpp:57:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 57 | scanf("%d%d", &x, &y); | ~~~~~^~~~~~~~~~~~~~~~
ソースコード
#include <bits/stdc++.h> using LL = long long; const int N = 1e3 + 7; int n, m, a[N]; std::vector<int> e[N]; int lch[N], rch[N], d[N], sz[N]; LL val[N], b[N]; int merge(int x, int y) { if(!x || !y) return x + y; if(val[x] < val[y]) std::swap(x, y); sz[x] += sz[y]; rch[x] = merge(rch[x], y); if(d[rch[x]] > d[lch[x]]) std::swap(lch[x], rch[x]); d[x] = d[rch[x]] + 1; return x; } int dfs(int x, int y) { int rt = 0; for(int v: e[x]) if(v != y) { int t = dfs(v, x); rt = merge(rt, t); b[x] += b[v]; } LL now = a[x]; while(sz[x] >= 2 && now < val[rt]) { now -= val[rt]; rt = merge(lch[rt], rch[rt]); now += val[rt]; rt = merge(lch[rt], rch[rt]); } if(now >= val[rt]) { val[x] = now; sz[x] = d[x] = 1; rt = merge(rt, x); return rt; } assert(sz[rt] == 1); b[x] += now - val[rt]; return 0; } int main() { scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%d", &a[i]); for(int i = 1, x, y; i < n; ++i) { scanf("%d%d", &x, &y); e[x].push_back(y); e[y].push_back(x); } val[0] = -1e18; int rt = dfs(1, 0); LL ans = (sz[rt] & 1 ? -b[1] : b[1]); for(int i = 1; rt; i = -i) { ans += i * val[rt]; rt = merge(lch[rt], rch[rt]); } printf("%lld\n", ans); return 0; }