记录编号 393899 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 秘术「天文密葬法」 最终得分 100
用户昵称 Gravatarfjzzq2002 是否通过 通过
代码语言 C++ 运行时间 1.495 s
提交时间 2017-04-12 13:47:53 内存使用 42.73 MiB
显示代码纯文本
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <string>
#include <bitset>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack>
#include <iomanip>
using namespace std;
#define pb push_back
#define mp make_pair
typedef pair<int,int> pii;
typedef long long ll;
typedef double ld;
typedef vector<int> vi;
#define fi first
#define se second
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define Edg int M=0,fst[SZ],vb[SZ],nxt[SZ];void ad_de(int a,int b){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;}void adde(int a,int b){ad_de(a,b);ad_de(b,a);}
#define Edgc int M=0,fst[SZ],vb[SZ],nxt[SZ],vc[SZ];void ad_de(int a,int b,int c){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;vc[M]=c;}void adde(int a,int b,int c){ad_de(a,b,c);ad_de(b,a,c);}
#define es(x,e) (int e=fst[x];e;e=nxt[e])
#define esb(x,e,b) (int e=fst[x],b=vb[e];e;e=nxt[e],b=vb[e])
#define VIZ {printf("digraph G{\n"); for(int i=1;i<=n;i++) for es(i,e) printf("%d->%d;\n",i,vb[e]); puts("}");}
#define VIZ2 {printf("graph G{\n"); for(int i=1;i<=n;i++) for es(i,e) if(vb[e]>=i)printf("%d--%d;\n",i,vb[e]); puts("}");}
#define SZ 555555
Edg
int n,l[SZ],r[SZ],fa[SZ],son[SZ],dep[SZ],md[SZ];
int pos[SZ],P=0; ll rs[SZ];
ld a[SZ],b[SZ],g,rst[SZ];
void gs(int x,int f=0)
{
	md[x]=dep[x];
	for esb(x,e,b)if(b!=f)
	{
		dep[b]=dep[x]+1; gs(b,x);
		if(md[b]>md[son[x]])
			son[x]=b;
		md[x]=max(md[x],md[b]);
	}
}
void all(int x,int f=0)
{
	pos[x]=++P;
	if(son[x]) all(son[x],x);
	for esb(x,e,b)
		if(b!=son[x]&&b!=f) all(b,x);
}
ld minn=1e18,tag[SZ]; int m;
void dfs(int x,int f=0)
{
	if(!son[x])
	{
		rst[pos[x]]=a[x]-b[x]*g;tag[x]=0;
		if(!m) minn=min(minn,rst[pos[x]]);
		return; //gg
	}
	//先考虑重链的作用,之后把重链与自己放在一起考虑
	{
	dfs(son[x],x); rst[pos[x]]=-tag[son[x]];
	tag[x]=tag[son[x]]+a[x]-b[x]*g;
	}
	//现在重链与自己已经一体了
	//所占的位置是[pos[x],pos[x]+md[x]-dep[x]]
	for esb(x,e,b)
	{
		if(b==son[x]||b==f) continue;
		dfs(b,x); int sr=md[b]-dep[b];
		for(int d=1;d-1<=sr&&d<=m;d++)
		{
			if(m-d<=md[x]-dep[x])
				minn=min(minn,rst[pos[b]+d-1]
				+rst[pos[x]+m-d]+tag[x]+tag[b]);
		}
		for(int d=0;d<=sr;d++)
			rst[pos[x]+d+1]=min(rst[pos[x]+d+1],
			rst[pos[b]+d]+tag[b]+a[x]-::b[x]*g-tag[x]);
	}
	if(m<=md[x]-dep[x]) minn=min(minn,rst[pos[x]+m]+tag[x]);
}
void dfs1(int x,int f=0)
{
	ld v=a[x]-b[x]*g;
	if(!son[x])
	{
		rst[x]=min(v,0.0);
		minn=min(minn,v);
		return;
	}
	rst[x]=v; 
	for esb(x,e,b) if(b!=f)
	{
		dfs1(b,x);
		minn=min(minn,rst[x]+rst[b]);
		rst[x]=min(rst[x],rst[b]+v);
	}
	if(rst[x]<0) rst[x]=0;
}
char ch,B[1<<15],*S=B,*T=B;
#define getc() (S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?0:*S++)
#define isd(c) (c>='0'&&c<='9')
int aa,bb;int F(){
    while(ch=getc(),!isd(ch)&&ch!='-');ch=='-'?aa=bb=0:(aa=ch-'0',bb=1);
    while(ch=getc(),isd(ch))aa=aa*10+ch-'0';return bb?aa:-aa;
}
#define gi F()
int main()
{
	freopen("cdcq_b.in","r",stdin);
	freopen("cdcq_b.out","w",stdout);
	n=gi; m=gi-1;
	for(int i=1;i<=n;i++) a[i]=gi;
	for(int i=1;i<=n;i++) b[i]=gi; 
	for(int i=1;i<n;i++) adde(gi,gi);
	gs(1); all(1);
	ld l=0,r=5e10;
	while(r-l>1e-4)
	{
		ld p=(l+r)/2; g=p;
		minn=1e18;
		if(m==-2) dfs1(1);
		else dfs(1);
		if(minn>0) l=p; else r=p;
	}
	if(r>4.5e10) puts("-1"); else printf("%.2lf\n",l);
}