记录编号 |
594765 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
秘术「天文密葬法」 |
最终得分 |
100 |
用户昵称 |
flyfree |
是否通过 |
通过 |
代码语言 |
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;
}