博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LUOGU P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat…
阅读量:4947 次
发布时间:2019-06-11

本文共 1189 字,大约阅读时间需要 3 分钟。

解题思路

首先第一遍dfs预处理出每个点的子树的siz,然后可以处理出放在根节点的答案,然后递推可得其他答案,递推方程 sum[u]=sum[x]-(val[i]*siz[u])+(siz[1]-siz[u])*val[i]

代码

#include
#include
#include
#include
#include
using namespace std;const int MAXN = 100005;typedef long long LL;inline int rd(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();} while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?x:-x;}LL ans,sum[MAXN],all[MAXN];int siz[MAXN],n,head[MAXN],cnt,to[MAXN<<1],nxt[MAXN<<1],val[MAXN<<1];inline void add(int bg,int ed,int w){ to[++cnt]=ed,nxt[cnt]=head[bg],val[cnt]=w,head[bg]=cnt;}void dfs1(int x,int fa,int d){ all[x]=(LL)siz[x]*d; for(register int i=head[x];i;i=nxt[i]){ int u=to[i];if(u==fa) continue; dfs1(u,x,d+val[i]); siz[x]+=siz[u];all[x]+=all[u]; }}void dfs2(int x,int fa){ for(register int i=head[x];i;i=nxt[i]){ int u=to[i];if(u==fa) continue; sum[u]=sum[x]-((LL)siz[u]*val[i])+(LL)(siz[1]-siz[u])*val[i]; ans=min(ans,sum[u]); dfs2(u,x); }}int main(){ n=rd();int x,y,z; for(int i=1;i<=n;i++) siz[i]=rd(); for(int i=1;i

转载于:https://www.cnblogs.com/sdfzsyq/p/9676828.html

你可能感兴趣的文章
原因和证明
查看>>
VC6.0图像处理2--图像的反色
查看>>
Snoop, 对WPF程序有效的SPY++机制
查看>>
Does not contain a valid host;port authority解决方法
查看>>
JAVA程序猿怎么才干高速查找到学习资料?
查看>>
使用axel下载百度云文件
查看>>
Qt中图像的显示与基本操作
查看>>
详解软件工程之软件测试
查看>>
WCF(二) 使用配置文件实现WCF应用程序
查看>>
【CodeForces 803 C】Maximal GCD(GCD+思维)
查看>>
python 去掉换行符或者改为其他方式结尾的方法(end='')
查看>>
数据模型(LP32 ILP32 LP64 LLP64 ILP64 )
查看>>
REST构架风格介绍:状态表述转移
查看>>
struct {0}初始化
查看>>
c++ operator
查看>>
apache 添加 ssl_module
查看>>
java小技巧
查看>>
POJ 3204 Ikki's Story I - Road Reconstruction
查看>>
getQueryString
查看>>
Servlet文件上传和下载的复习
查看>>