rt,提交记录
思路就是在 ci≤1 时把背包直接改为贪心
//when you use vector or deque,pay attention to the size of it.
//by OldDirverTree
#include<bits/stdc++.h>
//#include<atcoder/all>
#define P pair<int,int>
#define int long long
#define mid (l+r>>1)
using namespace std;
//using namespace atcoder;
const int N=1e5+1;
int Yorushika[N];
int n,a[N],b[N],f[N],g[N];
vector<int> G[N];
struct custom_hash
{
static uint64_t splitmix64(uint64_t x) {
x+=0x9e3779b97f4a7c15;
x=(x^(x>>30) )*0xbf58476d1ce4e5b9;
x=(x^(x>>27) )*0x94d049bb133111eb;
return x^(x>>31);
}
size_t operator() (uint64_t x) const {
static const uint64_t FIXED_RANDOM=chrono::steady_clock::now().time_since_epoch().count();
return splitmix64(x+FIXED_RANDOM);
}
};
int read() {
int x=0; bool f=true; char c=0;
while (!isdigit(c) ) f&=(c!='-'),c=getchar();
while (isdigit(c) ) x=(x<<3)+(x<<1)+(c&15),c=getchar();
return f?x:-x;
}
void dfs(int u,int fa)
{
int maxv=0,sum=0;
for (int v:G[u]) if (v^fa) dfs(v,u),maxv=max(maxv,b[v]);
f[u]=g[u]=1e9,Yorushika[0]=0;
if (maxv>1)
{
for (int v:G[u]) if (v^fa) {
for (int i=sum;~i;i--) Yorushika[i+b[v] ]=min(Yorushika[i+b[v] ]+f[v],Yorushika[i]+g[v]);
for (int i=0;i<b[v];i++) Yorushika[i]+=f[v]; sum+=b[v];
}
}
else
{
int now=0; vector<int> w;
for (int v:G[u]) if (v^fa) {
if (b[v]) now+=f[v],sum++,
w.push_back(g[v]-f[v]); else now+=g[v];
}
Yorushika[0]=now;
sort(w.begin(),w.end() );
for (int i=0;i<w.size();i++)
now+=w[i],Yorushika[i+1]=now;
}
for (int i=0;i<=sum;i++)
f[u]=min(Yorushika[i]+max(a[u]-i-b[fa],0ll),f[u]),
g[u]=min(Yorushika[i]+max(a[u]-i,0ll),g[u]),Yorushika[i]=1e9;
}
main()
{
n=read();
for (int i=1;i<=n;i++) a[i]=read();
for (int i=1;i<=n;i++) b[i]=read();
for (int i=1;i<n;i++) {
int x=read(),y=read();
G[x].push_back(y),G[y].push_back(x);
}
memset(Yorushika,0x3f,sizeof Yorushika);
return dfs(1,0),!printf("%lld",f[1]);
}