CF-1027-E. Kirei Attacks the Estate · znzryb
## 思路讲解
是比较简单的树上dp问题,记录一下。
```cpp
void dfs(ll node,ll x0,ll x1,ll cnt){
// x0表示cnt%2==0时加
if(vis[node]) return;
vis[node]=true;
ans[node]= cnt%2==0?A[node]+x1:A[node]+x0;
if(cnt%2==0){
x0-=A[node];
x1+=A[node];
}
if(cnt%2==1){
x0+=A[node];
x1-=A[node];
}
FOR(i,0,SZ(g[node])-1){
ll lnode=g[node][i];
if(vis[lnode]) continue;
dfs(lnode,max(0ll,x0),max(0ll,x1),cnt+1);
}
}
```
## AC代码
[https://codeforces.com/contest/2114/submission/323228554](https://codeforces.com/contest/2114/submission/323228554)
::: 源代码
```cpp
// Problem: E. Kirei Attacks the Estate
// Contest: Codeforces - Codeforces Round 1027 (Div. 3)
// URL: https://codeforces.com/contest/2114/problem/E
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
#define all(vec) vec.begin(),vec.end()
#define CLR(i,a) memset(i,a,sizeof(i))
#define fi first
#define se second
#define pb push_back
#define SZ(a) ((int) a.size())
#define FOR(i, a, b) for (int i = (a); i <= (b); ++i)
#define ROF(i, a, b) for (int i = (a); i >= (b); --i)
#define debug(var) cerr << #var <<":"<<var<<"\n";
#define lson(var) (var<<1)
#define rson(var) ((var<<1)+1)
using namespace std;
typedef long long ll;typedef unsigned long long ull;
typedef double DB;typedef long double LD;
typedef __int128 i128;typedef pair<DB,DB> pdd;typedef pair<ll,bool> plb;
typedef pair<ll,ll> pll;
typedef array<ll,3> arr3;typedef array<ll,2> arr2;
constexpr ll MAXN=static_cast<ll>(1e6)+10,INF=static_cast<ll>(1e9)+9; // 1e18+9也是素数
constexpr ll mod=static_cast<ll>(1e9)+7;
constexpr double eps=1e-8;
ll N,M,Q,X,K,lT,A[MAXN];
/*
*/
vector<ll> g[MAXN]; // 记得要清空
bool vis[MAXN];
ll ans[MAXN];
ll mxx[2];
inline void init(){
mxx[0]=0;mxx[1]=0;
FOR(i,0,N+5){g[i].clear();vis[i]=false;}
}
// cnt 是指 node 是该 vertical path 上的第几个点
void dfs(ll node,ll x0,ll x1,ll cnt){
// x0表示cnt%2==0时加
if(vis[node]) return;
vis[node]=true;
ans[node]= cnt%2==0?A[node]+x1:A[node]+x0;
#ifdef LOCAL
debug(node);
debug(ans[node]);
debug(x0);
debug(x1);
debug(A[node]);
#endif
if(cnt%2==0){
x0-=A[node];
x1+=A[node];
}
if(cnt%2==1){
x0+=A[node];
x1-=A[node];
}
#ifdef LOCAL
debug(x0);
debug(x1);
cerr<<"\n";
#endif
FOR(i,0,SZ(g[node])-1){
ll lnode=g[node][i];
if(vis[lnode]) continue;
dfs(lnode,max(0ll,x0),max(0ll,x1),cnt+1);
}
}
inline void solve(){
cin>>N;
init();
FOR(i,1,N){cin>>A[i];}
FOR(i,1,N-1){
ll u,v;cin>>u>>v;
g[u].pb(v);g[v].pb(u);
}
// root=1;
dfs(1,0,0,1);
FOR(i,1,N){cout<<ans[i]<<" ";}
cout<<"\n";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>lT;
while(lT--){
solve();
}
// solve();
return 0;
}
/*
AC
https://codeforces.com/contest/2114/submission/323228554
*/
```
:::
## 心路历程(WA,TLE,MLE……)