結果
| 問題 | No.1154 シュークリームゲーム(Hard) |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-01-11 14:09:48 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 8 ms / 2,000 ms |
| コード長 | 1,107 bytes |
| 記録 | |
| コンパイル時間 | 1,927 ms |
| コンパイル使用メモリ | 219,792 KB |
| 実行使用メモリ | 16,064 KB |
| 最終ジャッジ日時 | 2026-01-11 14:09:52 |
| 合計ジャッジ時間 | 3,622 ms |
|
ジャッジサーバーID (参考情報) |
judge6 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 40 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
template<typename T>
ll SZ(const T &a){
return a.size();
}
constexpr ll N=200010;
ll n,s,a[N];
vector<ll> T[N];
priority_queue<ll> pq[N];
void dfs(ll u){
ll son=0;
for(ll v:T[u]){
T[v].erase(find(T[v].begin(),T[v].end(),u));
dfs(v);
if(SZ(pq[v])>SZ(pq[son])){
son=v;
}
}
if(son){
pq[u].swap(pq[son]);
for(ll v:T[u]){
if(v!=son){
while(SZ(pq[v])){
pq[u].push(pq[v].top());
pq[v].pop();
}
}
}
}
ll o=1;
while(1){
if(!SZ(pq[u])){
if(o>0){
pq[u].push(a[u]);
}
else{
s+=a[u];
}
break;
}
if(pq[u].top()<=a[u]){
pq[u].push(a[u]);
break;
}
a[u]-=pq[u].top();
pq[u].pop();
o=-o;
if(SZ(pq[u])){
a[u]+=pq[u].top();
pq[u].pop();
o=-o;
}
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>n;
for(ll i=1;i<=n;i++){
cin>>a[i];
}
for(ll i=1,u,v;i<n;i++){
cin>>u>>v;
T[u].push_back(v);
T[v].push_back(u);
}
dfs(1);
ll ans=0,o=1;
while(SZ(pq[1])){
ans+=o*pq[1].top();
pq[1].pop();
o=-o;
}
cout<<ans+o*s<<"\n";
return 0;
}