比赛 |
cdcqの省选膜你赛 |
评测结果 |
AAWWWAAAAAAAAWAWAAAA |
题目名称 |
秘术「天文密葬法」 |
最终得分 |
75 |
用户昵称 |
fjzzq2002 |
运行时间 |
1.513 s |
代码语言 |
C++ |
内存使用 |
42.73 MiB |
提交时间 |
2017-04-11 22:05:56 |
显示代码纯文本
#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=0;d<=sr&&d<=m;d++)
{
if(m-d<=md[x]-dep[x])
minn=min(minn,rst[pos[b]+d]
+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);
}