题意

给定一棵\(n\)个节点的无根树,每个节点为黑色或者白色,每个点的答案为包含该点的子树(指无根子树)的白色节点数减黑色节点数的最大值

分析

对于无根树的题一般指定某一个点为根,不妨设为\(1\)

我们发现对于\(1\)号节点,他的某棵子树(将\(1\)视为根)如果白色节点数大于黑色节点数,则他的答案加上该差值

我们先采用树形\(DP\)将所有节点都这样统计一遍,这样就获得了来自子树的贡献

即\(a[i]\)为以\(i\)为根,所有白色节点数大于黑色节点数的子树的贡献

然后对于除\(1\)节点以外所有节点,还需要统计与父亲这一棵无向子树的关系

设遍历到\(now\)节点,子树节点为\(to\)节点

  • \(a[to]>0\),则\(now\)的答案子树包括\(to\)节点,\(to\)节点选择\(now\)的答案子树和\(to\)的答案子树中的最大值(因为已经包括,所以不是加和)

    \[a[to] = max(a[to], a[now])
    \]
  • \(a[to]\leq0\),则\(now\)的答案子树不包括\(to\)节点,\(to\)节点选择与\(now\)的答案子树进行拼接或不拼接的最大值(因为不包括,所以是加和)

    \[a[to] = max(a[to], a[now] + a[to])
    \]
#pragma GCC optimize(3, "Ofast", "inline")

#include <bits/stdc++.h>

#define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define int ll
#define ls st<<1
#define rs st<<1|1
#define pii pair<int,int>
using namespace std;
const int maxn = (ll) 3e5 + 5;
const int mod = 1000000007;
const int inf = 0x3f3f3f3f;
vector<int> v[maxn];
int a[maxn]; void dfs(int now, int pre) {
for (auto &to:v[now]) {
if (to == pre)
continue;
dfs(to, now);
if (a[to] > 0)
a[now] += a[to];
}
} void dfs2(int now, int pre) {
for (auto &to:v[now]) {
if (to == pre)
continue;
if (a[to] > 0)
a[to] = max(a[to], a[now]);
else
a[to] = max(a[to], a[now] + a[to]);
dfs2(to, now);
}
} signed main() {
start;
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
if (a[i] == 0)
a[i] = -1;
}
for (int i = 1; i < n; ++i) {
int x, y;
cin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1, 0);
dfs2(1, 0);
for (int i = 1; i <= n; ++i)
cout << a[i] << ' ';
return 0;
}

CodeForces 1324F Maximum White Subtree的更多相关文章

  1. Codeforces 1324F Maximum White Subtree DFS

    题意 给你无根一颗树,每个节点是黑色或白色.对于每一个节点,问包含该节点的权值最大的子树. 子树的权值等于子树中白点的个数减去黑点的个数. 注意,这里的子树指的是树的联通子图. 解题思路 这场就这题卡 ...

  2. CF1324 --- Maximum White Subtree

    CF1324 --- Maximum White Subtree 题干 You are given a tree consisting of \(n\) vertices. A tree is a c ...

  3. Codeforces Round #627 (Div. 3) F - Maximum White Subtree(深度优先搜索)

    题意: n 个点 n - 1 条边的树,问每个点所在所有子树中白黑点数目的最大差. 思路: 白点先由下至上汇集,后由上至下分并. #include <bits/stdc++.h> usin ...

  4. CF1324F Maximum White Subtree 题解

    原题链接 简要题意: 给定一棵树,每个点有黑白两种颜色:对每个节点,求出包含当前节点的连通图,使得白点数与黑点数差最小.输出这些值. F题也这么简单,咳咳,要是我也熬夜打上那么一场...可惜没时间打啊 ...

  5. CF1324F Maximum White Subtree——换根dp

    换根dp,一般用来解决在无根树上,需要以每个节点为根跑一边dfs的dp问题 我们做两遍dfs 先钦定任意一个点为根 第一遍,算出\(f_i\)表示\(i\)的子树产生的答案,这里,子树指的是以我们钦定 ...

  6. Codeforces 484B Maximum Value(高效+二分)

    题目链接:Codeforces 484B Maximum Value 题目大意:给定一个序列,找到连个数ai和aj,ai%aj尽量大,而且ai≥aj 解题思路:类似于素数筛选法的方式,每次枚举aj,然 ...

  7. Codeforces C. Maximum Value(枚举二分)

    题目描述: Maximum Value time limit per test 1 second memory limit per test 256 megabytes input standard ...

  8. [Leetcode] 1120. Maximum Average Subtree

    Given the root of a binary tree, find the maximum average value of any subtree of that tree. (A subt ...

  9. [codeforces 508E]Maximum Matching

    题目:Maximum Matching 传送门:http://codeforces.com/contest/1038/problem/E 分析: 一个块拥有{color1,val,color2},两个 ...

  10. 【LeetCode】1120. Maximum Average Subtree 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 日期 题目地址:https://leetcod ...

随机推荐

  1. 【CF】掉分总结

    比赛总结 前情提要 自从前段时间连续掉分,就心态崩了,还是自己太菜,一直想写个总结,看看这几场比赛都干了啥,以后准备怎么办.鸽了这么久的总结,是该写写了. 这是正文 首先大致提一下情感曲线(菜的真实) ...

  2. 2013年蓝桥杯C/C++大学A组省赛真题(振兴中华)

    题目描述: 小明参加了学校的趣味运动会,其中的一个项目是:跳格子. 地上画着一些格子,每个格子里写一个字,如下所示: 从我做起振 我做起振兴 做起振兴中 起振兴中华 比赛时,先站在左上角的写着&quo ...

  3. Galaxy 平台下 LEfSe 安装与使用教程

    LEfSe (Linear discriminant analysis Effect Size) 是一种用于发现和解释高维度数据生物标识(基因.通路和分类单元等)的分析工具,可以进行两个或多个分组的比 ...

  4. Active Directory Basic

    Active Directory 是 Windows 域网络的目录服务 介绍 Active Directory 是在域内部连接的机器和服务器的集合,它们是构成 Active Directory 网络的 ...

  5. wireshark基本使用

    Wireshark 是一种开源.跨平台的网络数据包分析工具,能够嗅探和调查实时流量并检查数据包捕获 (PCAP).它通常 被用作最好的数据包分析工具之一. 数据包过滤操作 ip过滤器 IP 过滤器帮助 ...

  6. Python 安装教程,新手入门(超详细)含Pycharm开发环境安装教程

    目录 一.Python介绍 二.Python安装教程 (一)Python的下载 (二)Python的安装 三.Pycharm开发工具的安装 (一)Pycharm介绍 (二)Pycharm的下载 (三) ...

  7. 文件系统考古2:1984 - BSD Fast Filing System

    今天继续与大家分享系列文章<50 years in filesystems>,由 KRISTIAN KÖHNTOPP 撰写. 我们将进入文件系统的第二个十年,即1984年,计算机由微型计算 ...

  8. shell编程-发送消息

    需求:利用 Linux 自带的 mesg 和 write 工具,编写一个向用户快速发送消息的脚本,输入用户名作为第一个参数,消息内容为第二个参数.脚本需要检测用户是否登录,是否打开消息功能,以及当前发 ...

  9. CtfShow信息收集1-20攻略

    CtfShow信息收集1-20关攻略 简单更新一下CTF关于信息收集的题目,总共20道,网站地址:https://ctf.show/challenges 第一关 我们可以看到提示:开发注释没有及时删除 ...

  10. 自然语言处理 Paddle NLP - 信息抽取技术及应用

    1.什么是信息抽取 即自动从无结构或半结构的文本中抽取出结构化信息的任务(病历抽取) 2.实体抽取 3.关系抽取 4.事件抽取 信息抽取和知识图谱是一个上下游的关系.抽取的结果,可以组装成知识图谱(一 ...