首页 > 其他分享 >CodeForces - 1092F Tree with Maximum Cost

CodeForces - 1092F Tree with Maximum Cost

时间:2022-11-12 15:24:45浏览次数:42  
标签:maxx int Tree CodeForces son Cost now dp define

题意:给出一棵树,每个结点有一个权值。定义一棵树以ai为根节点的价值为  剩下每个结点到根节点的距离乘权值  之和。求这棵树的最大价值。

解:随便选一个结点为根,从下到上统计当前价值,设son[i]为以i结点为子树根节点,这颗子树价值乘路径长度之和。考虑换根,令当前根ai的一个子节点aj为新的根,ai变成aj的子树。dp[ai]减去aj的贡献,aj原子节点深度减一,贡献减son[aj];剩下的结点深度加一,贡献加sum-son[aj].

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxx 200005
#define maxn 25
#define maxm 205
#define ll long long
#define inf 1000000009
#define mod 2520
struct edge{
    int u,v,w,next;
}e[maxx*2];
int head[maxx]={0},cnt=0;
void add(int u,int v){
    e[++cnt].u=u;e[cnt].v=v;e[cnt].next=head[u];head[u]=cnt;
}

int n;
ll ans=0,sum=0;
ll dp[maxx]={0};
ll son[maxx]={0};
ll a[maxx];
void dfs1(int now,int fa,int d){
    dp[now]=d*a[now];
    son[now]=a[now];
    for(int i=head[now];i;i=e[i].next){
        int to=e[i].v;
        if(to==fa) continue;
        dfs1(to,now,d+1);
        dp[now]+=dp[to];
        son[now]+=son[to];
    }
}
void dfs2(int now,int fa){
    ans=max(ans,dp[now]);
    for(int i=head[now];i;i=e[i].next){
        int to=e[i].v;
        if(to==fa) continue;
        dp[now]-=dp[to];
        dp[to]-=son[to];
        dp[to]+=(dp[now]+sum-son[to]);
        dfs2(to,now);
        dp[to]-=(dp[now]+sum-son[to]);
        dp[to]+=son[to];
        dp[now]+=dp[to];
    }
}
signed main() {
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        sum+=a[i];
    }
    for(int i=1;i<=n-1;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y);
        add(y,x);
    }
    dfs1(1,0,0);
    dfs2(1,0);
    printf("%lld\n",ans);
    return 0;
}
View Code

 

标签:maxx,int,Tree,CodeForces,son,Cost,now,dp,define
From: https://www.cnblogs.com/capterlliar/p/16883822.html

相关文章

  • TS 创建TreeNode类型
    想要实现的效果如:创建一个区域类,包含区域名称name,区域编码code,子区域childreninterfaceArea{name:string,code:string,children:Array<Area>}......
  • 运行npm install 时,卡在sill idealTree buildDeps没有反应
    .运行npminstall时,卡在sillidealTreebuildDeps没有反应npminstall一直停留在fetchMetadata:sillmapToRegistryurihttp://registry.npmjs.org/whatwg-fetch可以......
  • Codeforces 1738 / Codeforces Global Round 22
    目录ContestLinkProblemAGloryAddictsProblemBPrefixSumAddictsProblemCEvenNumberAddictsProblemDPermutationAddictsProblemEBalanceAddictsProblemF......
  • 「题解」Codeforces 1342F Make It Ascending
    只会\(\mathcal{O}(3^nn^2)\),打开题解一看怎么还真是这个玩意/jy首先集合之间形成一个sum和pos的二维偏序,那么思路就是对一维扫描线,然后另一维搞个什么东西。具体到......
  • 塔防(cover)Atcoder/Codeforces的某道题
    题目背景在某个塔防游戏中,有一种防御塔,可以攻击到上下左右四个方向以及自身位置的敌人。题目描述塔防游戏的⼀个关卡地图可以看作⼀个的矩阵,也就是⾏,列的矩阵。其......
  • Codeforces Round #172 (Div. 1) C. Game on Tree(期望的线性性质)
    题意是给出一棵有根树,每次等概率删除一个点以及以其为根的子树,问删完整棵树的期望步数。暴力枚举方案显然不可,考虑期望的线性性质,将问题转化为删除每个点的期望步数再求和......
  • Educational Codeforces Round 109 (Rated for Div. 2) E. Assimilation IV(期望的线性
    题意是有n个城市和m个点,已知每个城市到每个点的距离为\(a_{ij}\),每秒进行一次操作,每次随机选一个没选过的城市建一个碑,其影响的范围每秒加一,求n秒后被影响的点数的期......
  • Codeforces Round #688 (Div. 2) D
    D.Checkpoints对于单独的一个1我们知道他的贡献为211呢贡献值为4101贡献值为81001贡献值为16然后二进制拼凑就可以了对于有奇数的显然-1voidsolve(){int......
  • loj #10069. 「一本通 3.1 练习 4」Tree
    给你一个无向带权连通图,每条边是黑色或白色。求一棵最小权的恰好有K条白色边的生成树。题目保证有解  二分一个增加量md, 给每个白边权值加md,跑一下kruskal,......
  • Codeforces Round #695 (Div. 2) C
    C.ThreeBags我们发现这个题无非就是找一个最小的吸收了其他两组的数再回报过去但是自己组的只有两种选择要吗直接负汇报过去要吗就又要牺牲另一组的最小的一个数吸......