记录编号 594765 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 秘术「天文密葬法」 最终得分 100
用户昵称 Gravatarflyfree 是否通过 通过
代码语言 C++ 运行时间 2.765 s
提交时间 2024-10-05 07:49:00 内存使用 12.30 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
#define MAXN 200010
#define mod 0.0001
#define debug cout<<"flyfree\n";
//#define siz[x] vec[x].size()
inline ll read(){
	ll x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
vector <db> vec[MAXN];
ll n,m,idx,g,k;
db a[MAXN],b[MAXN];
ll hd[MAXN],ed[MAXN*2],nxt[MAXN*2];
ll f[MAXN],len[MAXN],son[MAXN],tp[MAXN];
db ad[MAXN];
void clear(){
	for(int i=1;i<=n;i++)vec[i].clear(),ad[i]=0.0;
	g=0,k=0;
}
void build(ll x,ll y){
	nxt[++idx]=hd[x];
	ed[idx]=y;
	hd[x]=idx;
}
void dfs1(ll now,ll fa){
	f[now]=fa,len[now]=1;
	for(int i=hd[now];i;i=nxt[i]){
		ll y=ed[i];
		if(y==fa)continue;
		dfs1(y,now);
		if(len[y]>len[son[now]]){
			son[now]=y;
			len[now]=len[y]+1;
		}
	}
}
void dfs2(ll now,ll fnt){
	tp[now]=fnt;
	if(!son[now])return;
	dfs2(son[now],fnt);
	for(int i=hd[now];i;i=nxt[i]){
		ll y=ed[i];
		if(y==son[now]||y==f[now])continue;
		dfs2(y,y);
	}
}
void pd(ll now,db ans){
//	cout<<now<<endl;
//	debug;	
	if((m==-1||m==1)&&(a[now]-b[now]*ans<=0)){
		g=1,k=1;
	}
	if(!son[now]){
		vec[tp[now]].push_back(0.0-ad[tp[now]]),ad[tp[now]]+=a[now]-b[now]*ans;
		return;
	}
//	debug;
	pd(son[now],ans);
//	cout<<now<<" ";
//	debug;?
	vec[tp[now]].push_back(0.0-ad[tp[now]]),ad[tp[now]]+=a[now]-b[now]*ans;
//	debug;?
	for(int i=hd[now];i;i=nxt[i]){
		ll y=ed[i];
		if(y==f[now]||y==son[now])continue;
		pd(y,ans);
		ll siz_y=vec[y].size(),siz_now=vec[tp[now]].size();
		if(m!=-1)for(int j=m-siz_now;j<=min(m-1,siz_y);j++){
			if(vec[tp[now]][siz_now-m+j]+vec[y][siz_y-j]+ad[tp[now]]+ad[y]<=0){
				g=1;
			}
		}
		for(int j=1;j<=siz_y;j++){
//			debug;
			vec[tp[now]][siz_now-j-1]=min(vec[tp[now]][siz_now-j-1],vec[y][siz_y-j]+ad[y]-ad[tp[now]]+a[now]-b[now]*ans);
			if(m==-1&&vec[tp[now]][siz_now-j-1]+ad[tp[now]]<=0)k=1;
		}
	}
	if(m!=-1&&vec[tp[now]].size()>=m)if(vec[tp[now]][vec[tp[now]].size()-m]+ad[tp[now]]<=0)g=1;
}
int main(){
	freopen("cdcq_b.in","r",stdin);
	freopen("cdcq_b.out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=(db)read();
	for(int i=1;i<=n;i++)b[i]=(db)read();
	for(int i=1;i<n;i++){
		ll x=read(),y=read();
		build(x,y);
		build(y,x);
	}
	dfs1(1,0);
	dfs2(1,1);
//	for(int i=1;i<=n;i++)cout<<i<<" "<<len[i]<<" "<<tp[i]<<endl;
	db l=0.0000,r=2000000.0000;
	while(r-l>mod){
//		if(l!=2000000.0000)printf("%.4f %.4f\n",l,r);
//		cout<<l<<" "<<r<<ndl;
		db mid=(l+r)/2;
		clear();
		pd(1,mid);
		if(m==-1&&k)r=mid;
		else if(m!=-1&&g)r=mid;
		else l=mid;
	}
//	l+=0.005;
	if(2000000.0000-l<=mod)cout<<"-1";
	else printf("%.2f",l);
	return 0;
}