TLE。
#include<bits/stdc++.h>
#define N 1000005
#define int long long
namespace IO{
template<typename T> inline void write(T x){
if(x<0) putchar('-'),x=-x;
if(x==0){
putchar('0'); return ;
}
if(x>9) write(x/10);
putchar(x%10+'0');
return ;
}
template<typename T> inline void read(T &x){
x=0; int w=1; char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') w=-1; ch=getchar();
}
while(isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x*=w; return ;
}
}
using namespace IO;
using namespace std;
struct star{
int next,to;
}e[N];
struct tree{
int v,ls,rs;
}t[N*5];
int n,head[N],tt[N],tot,id[N],cnt,INF,fa[N];
void add(int u,int v){
e[++cnt].next=head[u];
head[u]=cnt;
e[cnt].to=v;
}
int v[N],ans,rt[N];
void push_up(int p){
t[p].v=t[t[p].ls].v+t[t[p].rs].v;
}
void add(int &p,int l,int r,int v){
if(!p) p=++tot;
if(l==r){
t[p].v++;
return;
}
int mid=l+r>>1;
if(v<=mid) add(t[p].ls,l,mid,v);
else add(t[p].rs,mid+1,r,v);
push_up(p);
}
int query(int p,int l,int r,int vl,int vr){
if(!p) return 0;
if(l>=vl&&r<=vr) return t[p].v;
int mid=l+r>>1,res=0;
if(vl<=mid) res+=query(t[p].ls,l,mid,vl,vr);
if(r>mid) res+=query(t[p].rs,mid+1,r,vl,vr);
return res;
}
int mer(int p,int q,int l,int r){
if(!p||!q) return p+q;
if(l==r){
t[p].v+=t[q].v;
return p;
}
int mid=l+r>>1;
t[p].ls=mer(t[p].ls,t[q].ls,l,mid);
t[p].rs=mer(t[p].rs,t[q].rs,mid+1,r);
push_up(p); return p;
}
bool cmp(int x,int y){
return tt[x]>tt[y];
}
int Find(int x){
if(x==fa[x]) return x;
return fa[x]=Find(fa[x]);
}
signed main(){
read(n);
for(int i=1;i<=n;i++) read(tt[i]),fa[i]=id[i]=i;
for(int i=1;i<=n;i++) read(v[i]),INF=max(INF,v[i]);
for(int i=1,u,v;i<n;i++){
read(u),read(v);
add(u,v),add(v,u);
}
sort(id+1,id+n+1,cmp);
for(int i=1,u;i<=n;i++){
u=id[i],ans+=u;
add(rt[u],1,INF,v[u]);
for(int j=head[u];j;j=e[j].next){
int y=Find(e[j].to);
if(tt[y]<tt[u]) continue;
ans+=u*query(rt[u],1,INF,1,v[u])*query(rt[y],1,INF,v[u],INF);
ans+=u*query(rt[y],1,INF,1,v[u])*query(rt[u],1,INF,v[u],INF);
fa[y]=u,rt[u]=mer(rt[u],rt[y],1,INF);
}
}write(ans);
return 0;
}