Codeforces Round #525 E - Ehab and a component choosing problem
题目大意:
在一棵树中 选出k个联通块 使得 这k个联通块的点权总和 / k 最大
并且这k个联通块不相互覆盖(即一个点只能属于一个联通块)
如果有多种方案,找到k最大的那种
给定n 有n个点
给定n个点的点权(点权可能出现负数)
给定这个树的n-1条边
当将所有点分成联通块后,比较各个强联通块的点权总和,绝对存在最大值,而点权总和=最大值的也可能有多个
此时 若选择了所有点权总和等于最大值的联通块,那么 /k 之后得到的 ans=这个最大值
假设继续选择次大值,那么此时 res = (ans*k+次大值 ) / (k+1) ,显然这个res会因次大值而 res<ans,即选择次大值无法使得答案更优
所以若我们找到了最大值,最优的选择就是 直接选择所有点权总和等于最大值的联通块,无论点权总和最大值为正负,都是这样
不过由于点权存在负数,若要最大化点权总和,显然不能将点权为负数的点并做联通块
所以当u点要将v点并做联通块时,应先考虑v点的权值是否小于0,若小于0则不并
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=3e5+;
int n,k,a[N];
LL ans,fe[N];
vector <int> E[N];
void dfs(int u,int fa,int op) {
fe[u]=(LL)a[u];
for(int i=;i<E[u].size();i++) {
int v=E[u][i];
if(v==fa) continue;
dfs(v,u,op);
fe[u]+=max(fe[v],0LL);
}
if(op) ans=max(ans,fe[u]);
else if(fe[u]==ans) k++, fe[u]=0LL;
// 搜索最大值个数时 除记录个数外 将fe[u]置零
// 防止父亲(或父亲的父亲...)因加上该值又得到最大值 则发生覆盖
}
int main()
{
while(~scanf("%d",&n)) {
for(int i=;i<=n;i++) {
scanf("%d",&a[i]);
E[i].clear();
}
for(int i=;i<n;i++) {
int u,v; scanf("%d%d",&u,&v);
E[u].push_back(v), E[v].push_back(u);
}
ans=-INF; k=;
dfs(,,), dfs(,,);
// 1时搜出最大值 0时搜出不相互覆盖的最大值的个数
printf("%I64d %d\n",ans*(LL)k,k);
} return ;
}
Codeforces Round #525 E - Ehab and a component choosing problem的更多相关文章
- Codeforces Round #525 D - Ehab and another another xor problem /// 构造
题目大意: 本题有两个隐藏起来的a b(1<=a,b<=1e30) 每次可 printf("? %d %d\n",c,d); 表示询问 a^c 与 b^d 的相对大小 ...
- Codeforces Round #525 (Div. 2)E. Ehab and a component choosing problem
E. Ehab and a component choosing problem 题目链接:https://codeforces.com/contest/1088/problem/E 题意: 给出一个 ...
- Codeforces 1088E Ehab and a component choosing problem
Ehab and a component choosing problem 如果有多个连接件那么这几个连接件一定是一样大的, 所以我们先找到值最大的连通块这个肯定是分数的答案. dp[ i ]表示对于 ...
- Codeforces Round #525 (Div. 2) E. Ehab and a component choosing problem 数学
题意:给出树 求最大的sigma(a)/k k是选取的联通快个数 联通快不相交 思路: 这题和1个序列求最大的连续a 的平均值 这里先要满足最大平均值 而首先要满足最大 也就是一个数的时候可 ...
- cf1088E Ehab and a component choosing problem (树形dp)
题意(考试时看错了对着样例wa了好久..):从树上选k个连通块,使得权值的平均值最大的基础上,选的块数最多 如果不考虑块数最多的限制,肯定是只选一个权值最大的块是最好的 然后只要看这个权值最大的块有多 ...
- 【数学/贪心/DP】【CF1088E】 Ehab and a component choosing problem
Description 给定一棵 \(n\) 个节点的树,点有点权 \(a_u\),可能为负.现在请你在树上找出 \(k~(1~\leq~k~\leq~n)\) 个不相交集合,使得每个集合中的每对点都 ...
- cfE. Ehab and a component choosing problem(贪心)
题意 题目链接 给出一棵树,每个节点有权值,选出\(k\)个联通块,最大化 \[\frac{\sum_{i \in S} a_i}{k}\] Sol 结论:选出的\(k\)个联通块的大小是一样的且都等 ...
- Codeforces Round #525 (Div. 2) Solution
A. Ehab and another construction problem Water. #include <bits/stdc++.h> using namespace std; ...
- CodeForces Round 525
A:Ehab and another construction problem #include<bits/stdc++.h> using namespace std; #define F ...
随机推荐
- JAVA导出excel如何设置表头跨行或者跨列,跪求各位大神了
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 0));// 开始行,结束行,开始列,结束列.只能是POI了吧?java还有其他方法吗?
- Go语言基础:make,new, len, cap, append, delete方法
前面提到不少Go的内建函数,这篇文章学习下如何使用.. make 先拿 make 开刀,可是一开始我就进入了误区,因为我想先找到他的源码,先是发现 src/builtin/builtin.go 中 ...
- Ubuntu下安装Samba服务器
闲来无聊尝试自己安装下Samba服务器,使本机和虚拟机可以无障碍传输文件(虽然用VMwaretools可传,但总感觉麻烦,而且速度欠佳) 首先,同安装qemu一样,在安装之前要确定你的系统apt列表已 ...
- SDUTOJ 3374 数据结构实验之查找二:平衡二叉树
题目链接:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/3374.html 题目大意 略. 分析 ...
- upc组队赛2 Master of GCD 【线段树区间更新 || 差分】
Master of GCD 题目描述 Hakase has n numbers in a line. At fi rst, they are all equal to 1. Besides, Haka ...
- JQuery中内容操作函数、validation表单校验
JQuery:内容体拼接(可以直接拼接元素节点和内容节点) JQuery实现: 方案1:A.append(B); == B.appendTo(A);A的后面拼接B 方案2: A.prepend(B); ...
- linux 服务器修改密码
登录服务器后直接输入命令行passwd root 然后输入两次新密码就行
- Python生成腾讯云实时音视频的UserSig签名
1.UserSig 简介 官方文档链接:https://cloud.tencent.com/document/product/647/16790 腾讯云 IM 的前身是 QQ 的即时通讯消息系统,我们 ...
- extern static和函数
#include <stdio.h> int sum(int a, int b); int main() { /************************************** ...
- idea一直在copying resources或者一直在build,卡住不动,问题已解决
IDE在启动项目的过程中,一直copying,或者是build一直卡住,需要在modules中配置下,把target文件夹移出resource folder 同时,在此之前,我还屏蔽了项目中pom.x ...