【COGS2652】秘术「天文密葬法」

编程入门 行业动态 更新时间:2024-10-10 00:30:10

【COGS2652】秘术「<a href=https://www.elefans.com/category/jswz/34/1737973.html style=天文密葬法」"/>

【COGS2652】秘术「天文密葬法」

题目

思路

二分答案mid,那么显然我们要做的是check
于是乎,长链剖分维护即可

代码

#include<bits/stdc++.h>
#define eps 1e-5
using namespace std;
const int N=2e5+77;
int ls[N],Next[N<<1],ver[N<<1],cnt;
struct E
{int to,next;
}e[N<<1];
void add(int u,int v)
{e[++cnt].to=v,e[cnt].next=ls[u],ls[u]=cnt;
}
int n,m,a[N],b[N],len[N],son[N];
double val[N],tmp[N],*f[N],*id=tmp,ans=1e18,l,r,mid;
void dfs(int u,int fa)
{for(int i=ls[u]; i; i=e[i].next) if(e[i].to!=fa){dfs(e[i].to,u);if(len[e[i].to]>len[son[u]])son[u]=e[i].to;}len[u]=len[son[u]]+1;
}
void dp(int u,int fa)
{val[u]=a[u]-mid*b[u],f[u][0]=0;if(son[u])f[son[u]]=f[u]+1,dp(son[u],u),val[u]+=val[son[u]],f[u][0]-=val[son[u]];for(int i=ls[u]; i; i=e[i].next){int v=e[i].to;if(v==fa||v==son[u])continue;f[v]=id,id+=len[v],dp(v,u);for(int j=0;j<len[v]&&j<m;++j)if(m-j-1<len[u])ans=min(ans,f[v][j]+val[v]+f[u][m-j-1]+val[u]);for(int j=0;j<len[v]&&j<m;++j)f[u][j+1]=min(f[u][j+1],f[v][j]+val[v]-val[u]+a[u]-mid*b[u]);}if(m<len[u])ans=min(ans,f[u][m]+val[u]);
}
int main()
{scanf("%d%d",&n,&m); m--;for(int i=1; i<=n; i++) scanf("%d",&a[i]);for(int i=1; i<=n; i++) scanf("%d",&b[i]);for(int i=1; i<=n; i++) ans=min(ans,1.0*a[i]/b[i]);if(m==-2||!m){printf("%.2lf\n",ans); return 0;}for(int i=1,u,v; i<n; i++) scanf("%d%d",&u,&v),add(u,v),add(v,u);dfs(1,0);l=0,r=N;while(r-l>eps){mid=(l+r)/2;memset(tmp,0x7f,sizeof(tmp)),ans=1e18;id=tmp,f[1]=id,id+=len[1],dp(1,0);if(ans>=0)l=mid;else r=mid;}if(l>=200000) printf("-1\n");else printf("%.2lf\n",l);
}

更多推荐

【COGS2652】秘术「天文密葬法」

本文发布于:2024-03-13 08:12:45,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1733538.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:天文   秘术   密葬法

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!