CF1092 --- Tree with Maximum Cost

题干

You are given a tree consisting exactly of \(n\) vertices. Tree is a connected undirected graph with \(n−1\) edges. Each vertex \(v\) of this tree has a value \(a_v\) assigned to it.

Let \(dist(x,y)\) be the distance between the vertices \(x\) and \(y\). The distance between the vertices is the number of edges on the simple path between them.

Let's define the cost of the tree as the following value: firstly, let's fix some vertex of the tree. Let it be \(v\). Then the cost of the tree is \(\sum\limits_{i=1}^{n}dist(i, v)a_i\)

Your task is to calculate the maximum possible cost of the tree if you can choose \(v\) arbitrarily.

\(\mathcal{Input}\)

The first line contains one integer \(n\), the number of vertices in the tree \((1\leq n\leq 2⋅10^5)\).

The second line of the input contains \(n\) integers \(a_1,a_2, \cdots ,a_n \; (1\leq a_i\leq 2⋅10^5)\), where \(a_i\) is the value of the vertex \(i\).

Each of the next \(n−1\) lines describes an edge of the tree. Edge \(i\) is denoted by two integers \(u_i\) and \(v_i\), the labels of vertices it connects \((1\leq u_i,v_i\leq n, u_i\not= v_i).\)

It is guaranteed that the given edges form a tree.

\(\mathcal{Output}\)

Print one integer — the maximum possible cost of the tree if you can choose any vertex as \(v\).

\(\mathcal{Example}\)

\(Case_1\)

\(Input\)

8

9 4 1 7 10 1 6 5

1 2

2 3

1 4

1 5

5 6

5 7

5 8

\(Output\)

121

\(Case_2\)

\(Input\)

1

1337

\(Output\)

0

\(\mathcal{Note}\)

Picture corresponding to the first example:



You can choose the vertex \(3\) as a root, then the answer will be \(2⋅9+1⋅4+0⋅1+3⋅7+3⋅10+4⋅1+4⋅6+4⋅5=18+4+0+21+30+4+24+20=121\).

In the second example tree consists only of one vertex so the answer is always \(0\).

\(\mathcal{Tag}\)

dfs and similar dp tree *1800

思路分析

 本题要求解的是,对于树中所有结点,以该节点为根的情况下计算费用,并求费用的最大值。注意在结点非常多的情况下,要考虑\(int\)溢出的问题,故开\(long\;long\)(坑死我了)

暴力想法

 暴力想法很简单,很类似CF1324 --- Maximum White Subtree,这里直接搬运那个题解里面的图片



 对于任意结点,分别计算不同路径的位置,根据树数据结构的特点,可以把贡献分为:

  • 上层父祖先节点贡献
  • 下层子孙结点贡献

 然后就是,如何把暴力\(dfs\),通过记忆化实现算法优化。

算法优化

 我们先求解下层子孙结点的贡献,通过题目我们知道,从结点\(v\)转移到结点\(u\),其中增量的就是以\(v\)为根结点,其子树中所有结点值的和。其中\(a_i\)代表结点\(i\)的值,我们设\(f_i\)代表以\(i\)结点为子树根结点,该子树所有结点的和。我们设\(hp_i\)代表以\(i\)结点的下层子孙贡献值,这样我们可以写出下层子孙结点贡献值的转移表达值:

\[f[u] = f[v] + a[u]
\]

\[hp[u] = hp[v] + f[v]
\]

 现在我们解决了下层得想办法解决更加困难的上层了,对于这类换根dp问题,常用的手段是用利用父节点的值进行状态转移。在这里我们设\(dp_i\)为结点\(i\)的最终费用。因此对于某一节点(非根结点),该节点的最终费用可以表示为:

\[dp[cur] = dp[fa] - hp[cur] - f[cur] + f[fa] - f[cur] + hp[cur] = dp[fa] + f[fa] - 2*f[cur]
\]

 上述表达式的意思为:父节点刨去结点\(cur\)的费用值(\(dp[fa] - hp[cur] - f[cur]\),加上增量(\(f[fa] - f[cur]\), note 这里的f[fa],代表着所有的结点和),再最后加上下层子孙结点贡献值(\(hp[cur]\)).

\[dp[v] = \left\{\begin{array}
1hp[v] & if\; v = root \\
dp[fa] + f[fa] - 2*f[v] & if\; v \not= root\\
\end{array}\right.
\]

&emps;因此我们最终的思路还是为:

  • 从下往上树形\(dp\),计算\(f_v\),\(hp_v\)
  • 从上往下换根\(dp\),计算\(dp_v\)

代码

#include<bits/stdc++.h>
using namespace std; using LL = long long;
using VL = vector<LL>;
using VVL = vector<VL>;
LL mx = 0x8000000000000000;
VL a, f, hp, dp;
VVL e; void dfs(int x, int fa = -1)
{
f[x] = a[x], hp[x] = 0;
for (auto to : e[x])
{
if (to == fa) continue;
dfs(to, x);
f[x] += f[to];
hp[x] += (hp[to] + f[to]);
}
} void rdfs(int x, int fa = -1)
{
dp[x] = hp[x];
mx = max(mx, dp[x]);
for (auto to : e[x])
{
if (to == fa) continue;
hp[to] = dp[x] + f[x] - 2*f[to];
f[to] = f[x];
rdfs(to, x);
}
} int main()
{
int n;
cin >> n;
a = f = hp = dp = VL(n);
e = VVL(n); for (auto &x : a) cin >> x;
for (int i = 0; i < n - 1; ++ i)
{
int x, y;
cin >> x >> y;
-- x, -- y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs(0);
rdfs(0);
cout << mx << endl;
return 0;
}

 做了两次了,这个1092是自己手打的,还是有进步。WA了一次是没有考虑到整数溢出的情况以后得多加考虑。

以后对于每个根结点都要求的题,考虑优先换根dp

CF1092 --- Tree with Maximum Cost的更多相关文章

  1. Codeforces 1092F Tree with Maximum Cost(树形DP)

    题目链接:Tree with Maximum Cost 题意:给定一棵树,树上每个顶点都有属性值ai,树的边权为1,求$\sum\limits_{i = 1}^{n} dist(i, v) \cdot ...

  2. Codeforces Round #527 (Div. 3) F. Tree with Maximum Cost 【DFS换根 || 树形dp】

    传送门:http://codeforces.com/contest/1092/problem/F F. Tree with Maximum Cost time limit per test 2 sec ...

  3. Codeforces Round #527 (Div. 3) . F Tree with Maximum Cost

    题目链接 题意:给你一棵树,让你找一个顶点iii,使得这个点的∑dis(i,j)∗a[j]\sum dis(i,j)*a[j]∑dis(i,j)∗a[j]最大.dis(i,j)dis(i,j)dis( ...

  4. 2018.12.19 codeforces 1092F. Tree with Maximum Cost(换根dp)

    传送门 sbsbsb树形dpdpdp题. 题意简述:给出一棵边权为1的树,允许选任意一个点vvv为根,求∑i=1ndist(i,v)∗ai\sum_{i=1}^ndist(i,v)*a_i∑i=1n​ ...

  5. CF F - Tree with Maximum Cost (树形DP)给出你一颗带点权的树,dist(i, j)的值为节点i到j的距离乘上节点j的权值,让你任意找一个节点v,使得dist(v, i) (1 < i < n)的和最大。输出最大的值。

    题目意思: 给出你一颗带点权的树,dist(i, j)的值为节点i到j的距离乘上节点j的权值,让你任意找一个节点v,使得dist(v, i) (1 < i < n)的和最大.输出最大的值. ...

  6. Codeforces Round #527 F - Tree with Maximum Cost /// 树形DP

    题目大意: 给定一棵树 每个点都有点权 每条边的长度都为1 树上一点到另一点的距离为最短路经过的边的长度总和 树上一点到另一点的花费为距离乘另一点的点权 选定一点出发 使得其他点到该点的花费总和是最大 ...

  7. Codeforces 1092 F Tree with Maximum Cost (换根 + dfs)

    题意: 给你一棵无根树,每个节点有个权值$a_i$,指定一个点u,定义$\displaystyle value = \sum^v a_i*dist(u,v)$,求value的最大值 n,ai<= ...

  8. CF1092F Tree with Maximum Cost(dfs+dp)

    果然我已经菜到被\(div3\)的题虐哭了 qwq 首先看到这个题,一个比较显然的想法就是先从1号点开始\(dfs\)一遍,然后通过一些奇怪的方式,再\(dfs\)一遍得到其他点的贡献. 那么具体应该 ...

  9. 33. Minimum Depth of Binary Tree && Balanced Binary Tree && Maximum Depth of Binary Tree

    Minimum Depth of Binary Tree OJ: https://oj.leetcode.com/problems/minimum-depth-of-binary-tree/ Give ...

随机推荐

  1. LinkedHashMap 与 HashMap 实现的区别

    阅读前最好对 HashMap 的内部实现方式有一定了解 LinkedHashMap 继承自 HashMap 主要重写了一个节点类 LinkedHashMap.Entry,并维护一个头结点和尾节点 以及 ...

  2. Linux基础:Day06

    网路安全介绍背景: 早起的互联网 -- 1980年代 ,我们需要共享数据,传输数据:所传输或者共享的数据均为明文: 随着互连网发展,安全称为了国家的一种战略资源: 我们做的,比如编程,运维 -- 手工 ...

  3. flask-url_for

    flask-url_for flask的url_for函数和django的reverse函数类似,都是提供视图反转url的方法 from flask import Flask, url_for app ...

  4. 队列的含义以及C语言实现顺序队列

    队列,和栈一样,也是一种对数据的"存"和"取"有严格要求的线性存储结构. 什么是队列 与栈结构不同的是,队列的两端都"开口",要求数据只能从 ...

  5. Win10 cmd的ssh命令连接linux虚拟机

    其实就是一个小发现了~ 闲的没事的时候在cmd里面敲了ssh命令,居然提示是一个命令,貌似以前是没有这功能的.然后就打开虚拟机试试能不能远程连接.没想到还成功了~ 有了这功能就省得安装专门的远程连接工 ...

  6. mysql命令行参数 --- 这些参数不同于 mysqldump 后的 那些参数(下边文章开头有链接) :2种类型的参数 含义是不一样的

    mysql命令行参数  --- 这些参数不同于  mysqldump  后的 那些参数   :2种类型的参数 含义是不一样的 一,mysql命令行参数 Usage: mysql [OPTIONS] [ ...

  7. 数据结构和算法(Golang实现)(9)基础知识-算法复杂度及渐进符号

    算法复杂度及渐进符号 一.算法复杂度 首先每个程序运行过程中,都要占用一定的计算机资源,比如内存,磁盘等,这些是空间,计算过程中需要判断,循环执行某些逻辑,周而反复,这些是时间. 那么一个算法有多好, ...

  8. 【Java】Array 数组

    概述 数组是多个相同数据类型按一定顺序排列的一组数据 特点: - 数据类型相同!! - 长度固定!! 构成数组的几个要素 - 数组名称 - 下标,又称索引 - 元素 - 数组长度 数组是一种引用类型, ...

  9. delphi 捕捉全局异常错误的方法

    private     { Private declarations }   public   procedure GlobalExceptionHandler(Sender: TObject; E: ...

  10. stand up meeting 11/20/2015

    3组员 今日工作 工作耗时/h 明日计划 计划耗时/h 冯晓云 将输出string里的翻译合理取分为动名词等各种词性,按约定格式返回,按热度排列,但每一个词性下的解释仍然是由“$$”分词:对于查询词为 ...