E. Ehab and a component choosing problem

题目链接https://codeforces.com/contest/1088/problem/E

题意:

给出一个数,找出k个连通块,使得连通块里面点的和除以k最大。当选择不同数量的连通块有相同的最大值时,要求输出k最大的情况。

题解:

由于这个不等式average(x1,x2,x3...xn)<=max(x1,x2,...xn)成立(当且仅当x1=x2=...xn时,等号成立),而题目所求正好是连通块里面点和的平均值。

我们要让average(x1,x2,x3...xn)最大,一是尽量满足等号成立的条件,二是尽量让连通块里面的权和最大。

由于题目中要求k尽量最大。

所以我们可以进行两次dfs,第一次找出最大的连通块,第二次看看有多少个连通块等于之前找到的最大值,并且更新k的值以及所有点的权值和。

求最大连通块的时候用到最大连续子段和的技巧,负数就舍去,当儿子为正数才更新值。

代码如下:

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#define INF 9999999999
using namespace std; const int N = 3e5+ ;
typedef long long ll;
int a[N],head[N],vis[N];
int n,tot,k;
struct Edge{
int u,v,next;
}e[N<<];
ll dp[N];
ll ans=-INF;
void adde(int u,int v){
e[++tot].u=u;e[tot].v=v;e[tot].next=head[u];head[u]=tot;
e[++tot].u=v;e[tot].v=u;e[tot].next=head[v];head[v]=tot;
}
void dfs(int node,int f){
dp[node]=a[node];
vis[node]=;
for(int i=head[node];i!=-;i=e[i].next){
int v=e[i].v;
if(!vis[v]){
vis[v]=;
dfs(v,f);
if(dp[v]>) dp[node]+=dp[v];
}
}
if(!f) ans=max(ans,dp[node]);
else{
if(dp[node]==ans){
k++;
dp[node]=;
}
}
}
int main(){
scanf("%d",&n);
memset(head,-,sizeof(head));
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=,u,v;i<=n-;i++){
scanf("%d%d",&u,&v);
adde(u,v);
}
dfs(,);
memset(vis,,sizeof(vis));
dfs(,);
cout<<ans*k<<" "<<k<<endl;
return ;
}

Codeforces Round #525 (Div. 2)E. Ehab and a component choosing problem的更多相关文章

  1. Codeforces Round #525 (Div. 2) E. Ehab and a component choosing problem 数学

    题意:给出树 求最大的sigma(a)/k k是选取的联通快个数   联通快不相交 思路: 这题和1个序列求最大的连续a 的平均值  这里先要满足最大平均值  而首先要满足最大  也就是一个数的时候可 ...

  2. Codeforces Round #525 (Div. 2)D. Ehab and another another xor problem

    D. Ehab and another another xor problem 题目链接:https://codeforces.com/contest/1088/problem/D Descripti ...

  3. Codeforces Round #525 (Div. 2) D. Ehab and another another xor problem(待完成)

    参考资料: [1]:https://blog.csdn.net/weixin_43790474/article/details/84815383 [2]:http://www.cnblogs.com/ ...

  4. Codeforces Round #525 (Div. 2) D. Ehab and another another xor problem(交互题 异或)

    题目 题意: 0≤a,b<2^30, 最多猜62次. 交互题,题目设定好a,b的值,要你去猜.要你通过输入 c d : 如果 a^c < b^d ,会反馈 -1 : 如果 a^c = b^ ...

  5. Codeforces Round #525 (Div. 2) F. Ehab and a weird weight formula

    F. Ehab and a weird weight formula 题目链接:https://codeforces.com/contest/1088/problem/F 题意: 给出一颗点有权值的树 ...

  6. Codeforces Round #525 (Div. 2)B. Ehab and subtraction

    B. Ehab and subtraction 题目链接:https://codeforc.es/contest/1088/problem/B 题意: 给出n个数,给出k次操作,然后每次操作把所有数减 ...

  7. Codeforces Round #525 (Div. 2)A. Ehab and another construction problem

    A. Ehab and another construction problem 题目链接:https://codeforc.es/contest/1088/problem/A 题意: 给出一个x,找 ...

  8. Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task 数学 mod运算的性质

    C. Ehab and a 2-operation task 数学 mod运算的性质 题意: 有两种对前缀的运算 1.对前缀每一个\(a +x\) 2.对前缀每一个\(a\mod(x)\) 其中x任选 ...

  9. Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task

    传送门 https://www.cnblogs.com/violet-acmer/p/10068786.html 题意: 给定一个长度为 n 的数组a[ ],并且有两种操作: ①将前 i 个数全都加上 ...

随机推荐

  1. 解决软件启动报error while loading shared libraries: libgd.so.2: cannot open shared object错误

    解决软件启动报error while loading shared libraries: libgd.so.2: cannot open shared object错误 今天安装启动nginx的时候报 ...

  2. C语言学习记录_2019.02.02

    变量在第一次被使用之前应该赋初值 scanf(“%d”,&price); scanf(“price%d %d”,&price);  scanf中的东西一定是要输入的东西. 定义常量:c ...

  3. Jetson tx1 安装cuda错误

    前两天安装Jetpack3.0的时候,看着网上的教程以为cuda会自动安装上,但是历经好几次安装,都安装不上cuda,也刷了好几次jetpack包.搜遍了网上的教程,也没有安装上.错误如下图所示: 这 ...

  4. ISE中FPGA的实现流程

    一.ISE实现的步骤         在综合之后,我们开始启动FPGA在ISE中的实现过程,整个过程包括以下几个步骤:                 1.Translate              ...

  5. 2002: [Hnoi2010]Bounce 弹飞绵羊

    2002: [Hnoi2010]Bounce 弹飞绵羊 https://www.lydsy.com/JudgeOnline/problem.php?id=2002 分析: 绵羊在弹飞的路径中相当于一棵 ...

  6. Vue-router用法

    #全局守卫- router.beforeEach(to,from,next){} #全局后置钩子- router.afterEach(to,from){} #路由独享守卫- beforeEnter(t ...

  7. ArcPy:GeoJSON转ArcGIS Geometry

    import arcpy geojson = {"type":"Polygon","coordinates":[[[120.81878662 ...

  8. js鼠标事件相关知识

    1.mousedown->mouseup依次触发后相当于click事件 2.除了mouseenter和mouseleave外,其它的鼠标事件都是冒泡的 3.mouseover和mouseout事 ...

  9. Oracle修改表字段类型(number-->varchar2(len)),亲测可用

    思路: --新建临时表以存储正确的顺序create table A_2 as select (column1,colum2,……A表中的顺序) from A_1 ; --删除表A_1drop tabl ...

  10. Thymeleaf 使用时的标签

    1 . onclick事件   <a th:onclick="'javascript:more()'" ></a> 2.引入CSS样式 <link t ...