我们在树上的每个点iii上放aia_iai​个小点,初始时先让每个点单独减,这样要花费aia_iai​之和的次数。

然后尝试把某些减合并。一个点上面的小点至多可以向两个相邻的小点连边(这两个小点不能在同一个点上)。每连一条边,合并次数+1,答案-1。

问题变成求一棵树内的最大合并次数。

首先明确该问题满足最优子结构,即考虑以UUU为根的子树时,若U,VU,VU,V上的小点u,vu,vu,v可以合并,合并u,vu,vu,v 一定不比 不合并u,vu,vu,v以让fau,ufa_u,ufau​,u合并 劣。

感性证明:faufa_ufau​可能可以和不是uuu的其它小点合并,即使找不到其它可以合并的小点,前面的方案也不必后面的方案劣。

设gig_igi​表示考虑完以iii为根的子树,在合并次数最多的情况下,iii上最多有几个小点能和iii的父亲上的小点合并。转移讨论一下即可。

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int N=2e5+10;
struct Edge{int v,nxt;}e[N<<1];
int cnt,head[N],n;
ll ans,a[N];
void adde(int u,int v){e[++cnt].v=v;e[cnt].nxt=head[u];head[u]=cnt;
}
void dfs(int u,int fa){ll sum=0,maxn=0,pr;for(int i=head[u];i;i=e[i].nxt){int v=e[i].v;if(v==fa)continue;dfs(v,u);sum+=a[v],maxn=max(maxn,a[v]);}if(sum-maxn>=maxn) pr=sum/2;else pr=sum-maxn;if(sum<=a[u]) ans-=sum;else{pr=min(pr,min(sum-a[u],a[u]));ans-=a[u]+pr;a[u]-=pr;}
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lld",&a[i]);ans+=a[i];}for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);adde(u,v);adde(v,u);}dfs(1,0);printf("%lld\n",ans);return 0;
}

[XSY4197] Snow(树形DP)相关推荐

  1. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  2. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  3. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  4. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

  5. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  6. [NC15748]旅游 树形dp基础

    菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...

  7. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings

    题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...

  8. 树形dp ---- gym101667 A(贪心 + 树形dp + 两个dp方程组维护)

    题目链接 题目大意: 就是一棵5e35e35e3的树,可以选择一些点,放上基站,如果uuu上的基站价值为ddd,那么距离uuu小于等于ddd的点都会被覆盖,问使得整棵树被覆盖需要的最小价值. 解题思路 ...

  9. 树形dp ---- 2018年杭电多校第二场 H travel

    题目大意: 就是给你一个带点权的树,找到3条独立互不相交的路径使得权值和最大 解题思路: 很经典的树形dp 我们设dp[root][j][k]dp[root][j][k]dp[root][j][k]表 ...

最新文章

  1. 2022-2028年中国乙丙橡胶行业市场全景调查及投资潜力研究报告
  2. float 属性详解
  3. C语言,C#,Java,JavaScript之强类型与弱类型
  4. 实用ISA Server 2006之一: 简介
  5. 剑指Offer - 九度1511 - 从尾到头打印链表
  6. 理解SharePoint中的Managed Path
  7. 开发者在家办公第一天,竟然是这样度过的......
  8. 使用React Native和Spring Boot构建一个移动应用
  9. Manjaro oh-my-zsh安装配置
  10. java代码示例(6-2)
  11. 按一定条件筛选df1,返回结果中df1的索引取df2的数据
  12. 如何轻松查询分析多个快递单号物流到站派件延误件
  13. 关于VSCode 要求Java 11 升级的问题——“Java 11 or more recent is required to run the java extension“
  14. 【航线运输驾驶员理论考试】飞行原理
  15. (25)TracerWarning: Output nr 1. of the traced function does not match the corresponding output of ..
  16. 全新Swagger3.0教程,OAS3快速配置指南,实现API接口文档自动化!
  17. 影集制作php源码_最新仿720全景在线制作云平台网站PHP源码
  18. Sqlalchemy 使用add_columns函数
  19. 轻易解决VMware 虚拟机中被提示“请不要在虚拟机中运行此程序“
  20. 斐讯PSG1208 K1 路由器刷机

热门文章

  1. 12对胸椎对应体表标志_铁路信号之信号表示器及标志(三)
  2. android中的帧动画,[Android开发] Android中的帧动画
  3. leetcode435. 无重叠区间
  4. 《C++ Primer》7.3.4节练习
  5. 《C++ Primer》2.1.3节练习
  6. 写出TREE-MINIMUM 和TREE-MAXIMUM的递归版本(算法导论第三版12.2-2)
  7. oracle错误 904,ORACLE 导出错误 EXP-00008: 遇到 Oracle 错误 904
  8. word List 22
  9. 广义表的学习(原理和代码)
  10. [2021.1.17多校省选模拟4]T1(莫比乌斯反演/组合数学/枚举倍数)