#6WA飞了,走过路过的大佬来看看吧,给个HACK也行
查看原帖
#6WA飞了,走过路过的大佬来看看吧,给个HACK也行
180924
FLAT_LCH楼主2022/5/19 16:05
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <algorithm>

#define inf 0x3f3f3f3f3f3f3f3f

using namespace std;

struct bian
{
	long long v,nex;
}s[300000];
struct node
{
	long long head,son,fa,top;
	long long a,b,dis;
	long long siz,dp;
}tre[300000];
struct node1
{
	long long id,dui;
	long long dp,a,b;
	bool could;
}p[300000];

long long n,len=0;
long long q[300000];

inline long long rd()
{
	long long s=0,w=1;char x='x';
	while(x<'0'||x>'9'){x=getchar();if(x=='-')w=-1;}
	while(x>='0'&&x<='9'){s=s*10+(x^48);x=getchar();}
	return s*w;
}

inline void lian(long long u,long long v)
{
	len++;s[len].v=v;s[len].nex=tre[u].head;tre[u].head=len;
	len++;s[len].v=u;s[len].nex=tre[v].head;tre[v].head=len;
}


inline void pushback(long long u,bool x){len++;p[len]={len,u,tre[u].dp,tre[u].a,tre[u].b,x};}

inline void  readd()
{
	n=rd();
	for(long long i=1;i<=n;i++)
		tre[i].a=rd(),tre[i].dp=inf;
	for(long long i=1;i<=n;i++)
		tre[i].b=rd();
	for(long long i=1,u,v;i<n;i++)
	{
		u=rd();v=rd();
		lian(u,v);
	}
}

void build1(long long u)
{
	tre[u].siz=1;//tre[u].dp=inf;
	for(long long i=tre[u].head,v;i;i=s[i].nex)
	{
		v=s[i].v;
		if(v!=tre[u].fa)
		{
			tre[v].fa=u;tre[v].dis=tre[u].dis+1;
			build1(v);
			tre[u].siz+=tre[v].siz;
			if(tre[u].son==0||tre[v].siz>tre[tre[u].son].siz)
				tre[u].son=v;
		}
	}
}

void build2(long long u)
{
	//cout<<u<<","<<tre[u].son<<"\n";
	if(tre[u].son==0)return;
	tre[tre[u].son].top=tre[u].top;
	build2(tre[u].son);
	for(long long i=tre[u].head,v;i;i=s[i].nex)
	{
		v=s[i].v;
		if(v!=tre[u].fa&&v!=tre[u].son)
		{
			tre[v].top=v;
			build2(v);
		}
	}
}

void add(long long u)
{
	pushback(u,false);
	for(long long i=tre[u].head,v;i;i=s[i].nex)
	{
		v=s[i].v;
		if(v!=tre[u].fa)
			add(v);
	}
}

inline bool cmp1(node1 x,node1 y){return x.b!=y.b?x.b<y.b:x.dp<y.dp;}
inline bool cmp2(node1 x,node1 y){return -x.a<-y.a;}
inline bool cmp3(node1 x,node1 y){return x.id<y.id;}

/*
f[i]=f[j]+a[i]*b[j]
f[j]=-a[i]*b[j]+f[i]

f[i]min=>XIA_TU_KE
y:f[j]
k:-a[i]
x:b[j] 
b:f[i]
*/

void cdq(long long l,long long r)
{
	if(l>=r)
		return;
	long long mid=(l+r)/2;
	cdq(l,mid);
	sort(p+l,p+mid+1,cmp1);
	sort(p+mid+1,p+r+1,cmp2);
	
	long long head=1,tail=0;
	for(long long i=l;i<=mid;i++)
	{
		if(i!=l&&p[i].b==p[i-1].b)continue;
		while(head<tail&&(p[q[tail]].dp-p[q[tail-1]].dp)*(p[i].b-p[q[tail-1]].b)>(p[i].dp-p[q[tail-1]].dp)*(p[q[tail]].b-p[q[tail-1]].b))tail--;
		q[++tail]=i;
	}
	for(long long i=mid+1;i<=r;i++)
	{
		if(!p[i].could)continue;
		while(head<tail&&p[q[head+1]].dp+p[i].a*p[q[head+1]].b<=p[q[head]].dp+p[i].a*p[q[head]].b)head++;
		p[i].dp=min(p[i].dp,p[q[head]].dp+p[i].a*p[q[head]].b);
	}
	
	sort(p+l,p+r+1,cmp3);
	cdq(mid+1,r);
}

void solve(long long u)
{
	for(long long i=tre[u].head,v;i;i=s[i].nex)
	{
		v=s[i].v;
		if(v!=tre[u].fa&&v!=tre[u].son)
			solve(v);
	}
	if(tre[u].son==0)
		tre[u].dp=0;
	else
		solve(tre[u].son);
	for(long long i=tre[u].head,v;i;i=s[i].nex)
	{
		v=s[i].v;
		if(v!=tre[u].fa&&v!=tre[u].son)
			add(v);
	}
	pushback(u,tre[u].son!=0);
	//cout<<u<<' '<<tre[u].top<<endl;
	if(tre[u].top==u)
	{
		//cout<<u<<","<<len<<endl;
		cdq(1,len);
		for(long long i=1;i<=len;i++)
			tre[p[i].dui].dp=min(p[i].dp,tre[p[i].dui].dp);
		len=0;
	}
}

inline void print()
{
	for(long long i=1;i<=n;i++)
		printf("%lld ",tre[i].dp);
}

int main()
{
	readd();
	tre[1].dis=1;tre[1].fa=0; tre[1].top=1;
	build1(1);
	build2(1);
	len=0;
	solve(1);
	print();
	return 0;
}
/*

19
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 2
1 3
1 4
2 5
5 6 
5 7
7 8
3 9
3 10
9 11
9 12
11 14
14 15
14 16
10 13
4 17
17 18
18 19
*/
2022/5/19 16:05
加载中...