题目链接:点击查看

题目大意:给出一棵树,每个顶点都有权值,在树上选出k个相互独立的连通块,使得其权值和的平均值最大的情况下选的块数最多

题目分析:这个题目中平均值的优先级大于块数,那么我们可以在树上找到一块权值最大的连通块,记录下他的权值后,在对于整棵树搜索一下有几个权值等于上述最大值并且相互独立的连通块,可以用树形dp自底向上来记录每棵子树的最大权值和,对于每个顶点,我们可以选择用或不用,计算出最大的权值和后再跑一边dfs,求出有多少个符合条件的连通块即可,不过不知道为什么我自己编了一组数据过不了,但是却AC了。。数据也留一下吧

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=3e5+100;vector<int>node[N];int val[N];LL dp[N];LL mmax,ans;void dfs1(int u,int fa)
{dp[u]=val[u];for(int i=0;i<node[u].size();i++){int v=node[u][i];if(v==fa)continue;dfs1(v,u);dp[u]+=max(dp[v],0LL);}mmax=max(mmax,dp[u]);
}void dfs2(int u,int fa)
{dp[u]=val[u];for(int i=0;i<node[u].size();i++){int v=node[u][i];if(v==fa)continue;dfs2(v,u);dp[u]+=max(dp[v],0LL);}if(dp[u]==mmax){ans++;dp[u]=-inf;}
}int main()
{
//  freopen("input.txt","r",stdin)int n;while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;i++){scanf("%d",val+i);node[i].clear();}for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);node[u].push_back(v);node[v].push_back(u);}mmax=-inf;ans=0;dfs1(1,-1);dfs2(1,-1);cout<<mmax*ans<<' '<<ans<<endl;}/*61 3 -1 -1 1 11 32 33 44 54 6代码答案:4 1我的答案:3 1*/return 0;
}

CodeForces - 1088E Ehab and a component choosing problem(树形dp)相关推荐

  1. Codeforces 1088E Ehab and a component choosing problem(树形DP)

    Codeforces 1088E Ehab and a component choosing problem(树形DP) 题意 给一棵树,要求从中选一些联通分量,使得平均联通分量重量总和最大.如果有多 ...

  2. Codeforces - Ehab and a component choosing problem

    题目链接:Codeforces - Ehab and a component choosing problem 显然 Σa / k,相当于取平均值,我们得到最大值肯定是k=1的时候. 求最大值树形dp ...

  3. Codeforces Round#525(Div.2)Ehab and a component choosing problem CodeForces - 1088E

    题意: 有一个拥有 n 个节点的树,你要选 k 个联通块出来,使得这 k 个联通块中所有点的权值总和 sum 与联通块个数 k  的比值最大,多解时应使联通块的数量尽可能地多 #include< ...

  4. CodeForces - 1174D Ehab and the Expected XOR Problem(构造+思维+位运算)

    题目链接:点击查看 题目大意:给出一个 n,再给出一个 x,要求构造一个数列,满足该数列的所有子串的异或和都不等于 0 且都不等于 x,在满足上面的条件下尽可能长 题目分析:因为这个题目最终的目标是需 ...

  5. Codeforces Round #630 (Div. 2) F. Independent Set 树形dp

    传送门 文章目录 题意: 思路: 题意: 给你一棵树,求这棵树的边导出子图中独立集的数量和,独立集大小可以为000. 思路: 先考虑普通的独立集数量怎么求,无非就是分情况讨论一下选根还是不选根,而这个 ...

  6. Codeforces 766E Mahmoud and a xor trip(树形DP)

    题目链接 Mahmoud and a xor trip 树形DP.先考虑每个点到他本身的距离和,再算所有点两两距离和. 做的时候考虑二进制拆位即可. #include <bits/stdc++. ...

  7. 【CodeForces - 1153D】Serval and Rooted Tree(树形dp)

    题干: Now Serval is a junior high school student in Japari Middle School, and he is still thrilled on ...

  8. Codeforces Round #628 (Div. 2) E. Ehab‘s REAL Number Theory Problem 巧妙的质因子建图

    传送门 文章目录 题意: 思路: 题意: 给你nnn个数,每个数的因子个数不超过777个,选出最少的数使其乘积为平方数. n≤1e5n\le 1e5n≤1e5 思路: 由于因子不超过777个,所以由约 ...

  9. 【Codeforces Round #525(Div. 2)】Ehab and another another xor problem(思维+异或)

    题目链接 D. Ehab and another another xor problem time limit per test 1 second memory limit per test 256 ...

最新文章

  1. GDI 泄漏检测方法
  2. 构建dubbo分布式平台-maven构建ant-framework框架的pom.xml文件配置
  3. P1121 环状最大两段子段和
  4. JAVA——基于HttpClient的通过单点登录方式(统一身份认证平台)登录正方教务系统[1999-2020]基本解决方案
  5. 【CentOS 7笔记46】,crondtab任务计划和chkconfig系统服务管理#
  6. 逆向工程核心原理读书笔记-API钩取之计算器显示中文数字
  7. JavaScript面向对象——深入理解寄生组合继承
  8. Windows、Linux和MAC的CR, LF, CR/LF换行符
  9. 链表反转python
  10. JAVA环境配置 ECLIPSE配置(转)
  11. 【LeetCode】剑指 Offer 65. 不用加减乘除做加法
  12. 格式化表单js插件jquery.serializeJSON
  13. Pytorch中DataLoader相关操作
  14. ISA 2000与ISA 2004的区别
  15. 坚果云下载的文件夹在哪_如何建立合理的坚果云文件夹结构?
  16. c语言的switch中case,c语言switch中case语句
  17. js实现京东购物放大镜和选项卡效果
  18. 本地下载配置dubbo.xsd文件
  19. Revit轴网绘制中怎么生成轴网?
  20. Arduino的硬件:什么是单片机?什么是Arduino?Arduino和单片机区别?Arduino有哪些种类?Arduino扩展板有哪些?

热门文章

  1. MySQL+号的作用
  2. Nginx负载均衡策略介绍
  3. Nginx反向代理之proxy_set_header指令
  4. Spring Framework总览面试题精选
  5. 茅塞顿开:Spring Aware原理解析
  6. IDEA下SVN基本使用
  7. 静态方法-应用场景和定义方式
  8. Oracle之用户操作
  9. ldap odbc mysql_Mysql+ODBC+OpenLDAP
  10. JAVA学生成绩分析系统任务书,学籍管理系统任务书