社区讨论
树形dp50pts求调
P6554Promises I Can't Keep参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @logkj8of
- 此快照首次捕获于
- 2023/11/02 10:29 2 年前
- 此快照最后确认于
- 2023/11/02 10:29 2 年前
CPP
#include<bits/stdc++.h>
#define double long double
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
auto _u=[](char x){return x>='0'&&x<='9';};
for(;!_u(ch);ch=='-'&&(f=-1),ch=getchar());
for(;_u(ch);x=(x<<1)+(x<<3)+(ch^48),ch=getchar());
return x*f;
}
inline void write(int num,bool flag=0){
static int st[39],tp=0;
num<0&&(putchar('-'),num=-num);
do st[++tp]=num%10;while(num/=10);
while(tp) putchar(st[tp--]|48);
putchar(flag?'\n':' ');
return;
}
template<typename...Args>
inline void write(int t,Args...args){
return write(t),write(args...);
}
const int N=5e5+10;
double dp[N],g[N];//dp[u] 表示以 u 为根的子树的权值和
//g[u] 表示以 u 为根的整个树的权值和
int val[N],a[N];
double ans=-1e9;
vector<int>e[N];
int rt;
inline void dfs(int u,int f){
val[u]=(e[u].size()==1);
for(int to:e[u])
if(to!=f) dfs(to,u),dp[u]+=dp[to],val[u]+=val[to];
dp[u]+=val[u]*a[u];
return;
}
inline void dfs1(int u,int f){
if(!f){
g[u]=dp[u];
}else{
g[u]=g[f]-a[f]*val[u]+a[u]*(val[rt]-val[u]);
if(e[u].size()==1) g[u]-=a[u];
}
for(int to:e[u])
if(to!=f) dfs1(to,u);
ans=max(ans,g[u]/(val[rt]-(e[u].size()==1)));
return;
}
int n;
signed main(){
n=read();
for(int i=1,x,y;i<n;++i)
x=read(),y=read(),e[x].push_back(y),e[y].push_back(x);
for(int i=1;i<=n;++i)a[i]=read();
for(int i=1;i<=n;++i) if(e[i].size()>1) rt=i;
dfs(rt,0);
dfs1(rt,0);
printf("%.4Lf\n",ans);
return(0-0);
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...