CF2062D Balanced Tree 题解
_fairytale_ · · 题解
-87,哈哈。
我们随便定一个根,然后把操作改写成子树
有一个性质是,在每个点的
回到原题,一个贪心的想法是直接令
void Solve_(){
int n;
cin>>n;
vector<int>l(n+1),r(n+1);
rep(i,1,n)cin>>l[i]>>r[i];
vector<vector<int>>g(n+1);
for(int i=2,u,v;i<=n;++i){
cin>>u>>v;
g[u].ep(v),g[v].ep(u);
}
vector<ll>f(n+1);
vector<int>a(n+1);
auto dfs=[&](auto &self,int u,int fa)->void{
for(int v:g[u])if(v!=fa){
self(self,v,u);
ckmax(a[u],a[v]);
f[u]+=f[v];
}
if(a[u]<l[u])a[u]=l[u];
else if(a[u]>r[u])a[u]=r[u];
for(int v:g[u])if(v!=fa)if(a[u]<a[v])f[u]+=a[v]-a[u];
};
dfs(dfs,1,0);
cout<<a[1]+f[1]<<'\n';
}