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

题意

给一棵树,要求从中选一些联通分量,使得平均联通分量重量总和最大。如果有多种选法,那么就使得选的联通分量数量越多越好。

思路

做一个树形dp,如果子节点的重量能增加本节点的重量,那就增加,否则(即子节点当前分量的重量小于0)就另开联通分量。

需要注意的是,要求k越大越好,意味着我们需要找到所有重量达到最大值相等的联通分量,此时可能会出现一些联通分量会交叉覆盖的情况,我们需要重新做一次dfs,此时如果某个联通分量的值已经达到最大了,那么我们就把该节点记录以后就赋值为0,防止他的父亲再次覆盖它。

比如这一组样例:

3

-3 3 3

1 3

1 2

我一开始还用bfs写了一个联通分量如果同符号的话就缩点的操作,写丑了,碰瓷test6死都过不去(总重量是没错了,但是k总是少),看了官方题解,删了就秒过。

代码

#include <iostream>
#include <vector>
#include <unordered_map>
#include <queue>
#include <cstring>
using namespace std;
struct edge{long long from;long long to;long long nxt;edge(long long f,long long t,long long n):from(f),to(t),nxt(n){}
};
long long egs[300005];
vector<edge> edges;
void addedge(long long f,long long t){edges.emplace_back(f,t,egs[f]);egs[f]=edges.size()-1;
}long long a[300005];
unordered_map<long long,long long> mmp;
long long sumer[300005];
long long sumers;
long long k;
void dfs2(long long num,long long fa,bool flag=false){sumer[num]=a[num];for(long long i=egs[num];i!=-1;i=edges[i].nxt){if(edges[i].to==fa){continue;}dfs2(edges[i].to,num,flag);if(sumer[edges[i].to]>0){sumer[num]+=sumer[edges[i].to];}}if(!flag && sumers<sumer[num]){sumers=sumer[num];}else if(sumers==sumer[num] && flag){k++;sumer[num]=0;}
}
int main() {long long n;ios::sync_with_stdio(false);cin.tie(0);cin>>n;memset(egs,-1,sizeof egs);edges.clear();bool neg=true;for(long long i=1;i<=n;i++){cin>>a[i];if(a[i]>=0){neg=false;}}for(long long i=0;i<n-1;i++){long long u,v;cin>>u>>v;addedge(u,v);addedge(v,u);}if(neg){long long maxer=-0x3f3f3f3f3f3f3f3f;for(long long i=1;i<=n;i++){if(mmp.find(a[i])!=mmp.end()){mmp[a[i]]++;}else{mmp[a[i]]=1;}maxer=max(a[i],maxer);}cout<<maxer*mmp[maxer]<<" "<<mmp[maxer]<<endl;}else{sumers=0;k=0;dfs2(1,0);dfs2(1,0,true);cout<<sumers*k<<" "<<k<<endl;}return 0;
}

感谢一个官方题解:
http://codeforces.com/blog/entry/63656

Codeforces 1088E Ehab and a component choosing problem(树形DP)相关推荐

  1. CodeForces - 1088E Ehab and a component choosing problem(树形dp)

    题目链接:点击查看 题目大意:给出一棵树,每个顶点都有权值,在树上选出k个相互独立的连通块,使得其权值和的平均值最大的情况下选的块数最多 题目分析:这个题目中平均值的优先级大于块数,那么我们可以在树上 ...

  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. mSystems:青大苏晓泉阐述微生物组的Beta多样性-从全局比对到局部比对
  2. STM32F10x_StdPeriph_Lib_V3.5.0库时钟分析及如何配置
  3. 宽带651以及光猫红色灯闪烁-故障维修
  4. idea 创建多模块依赖Maven项目
  5. [算法设计题]输出三角形图形
  6. 二分法求非线性方程组Java_用C#编写二分法解一元非线性方程
  7. js未知数加已知数的结果数,三者的每个数字不重复
  8. 【SDPVRP】基于matlab遗传算法求解同时取送货的车辆路径问题【含Matlab源码 1487期】
  9. Postman的测试脚本(一)
  10. 揭秘百度新治理结构:马东敏的谣言与李彦宏的用人观
  11. 关于华三路由器nat映射ftp端口号登录服务器失败问题
  12. 第二重要极限公式推导过程_机器学习——一文详解逻辑回归「附详细推导和代码」...
  13. while循环CPU占用率高问题深入分析与解决方案
  14. pta 7-1 走楼梯升级版(递归)
  15. 《软件方法》第二章 自测题
  16. [SV]SystemVerilog学习笔记之struct union
  17. ATF 安全启动过程
  18. springboot+vue球员数据统计分析系统java
  19. nslookup 包含在那个包中_nslookup详解(name server lookup)( 域名查询)
  20. 用python编程 商品打折怎么计算_(特价书)从问题到程序:用Python学编程和计算

热门文章

  1. h5页面唤起app(iOS和Android),没有安装则跳转下载页面
  2. MFCC算法讲解及实现(matlab)
  3. java mfcc_基于MFCC的语音评测方法
  4. 如何申请成为社区的YY讲师?
  5. 解释Shaply值方法的合理性及其局限性(不足)
  6. Colmap学习四:后端resection部分(后方交会,PnP、P3P、EPnp、Nakano P3P)
  7. 解释清楚常见网络设备的部署模式及优缺点
  8. 响应式前端框架Admui太完备了,太美了
  9. 查看手机UDID的方法
  10. 只需要把脸对准摄像头就可以实现刷脸支付