题意

给定一棵\(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. 解决pytest+allure报告中文乱码

    在conftest文件里添加钩子函数: def pytest_collection_modifyitems(items): """ 测试用例收集完成时,将收集到的item ...

  2. 如何借助Kafka持久化存储K8S事件数据?

    大家应该对 Kubernetes Events 并不陌生,特别是当你使用 kubectl describe 命令或 Event API 资源来了解集群中的故障时. $ kubectl get even ...

  3. 渗透测试-struts2攻防环境搭建拿shell

    一.下载Jspstudy 打开目录D:\JspStudy\tomcat\webapps 二.打开struts2并进行拿shell 1.打开struts2 在浏览器中输入网址http://localho ...

  4. awk 内置变量与自定义变量

    点击上方" 生信科技爱好者 ",马上关注 真爱,请置顶或星标 作者:ghostwu 原文:https://www.cnblogs.com/ghostwu/p/9085653.htm ...

  5. VSCode 中利用 Remote SSH 连接远程服务器

    北京时间 2019 年 5 月 3 日,在 PyCon 2019 大会上,微软发布了 VS Code Remote.这是一个用来实现远程开发的功能插件,对于许多使用 Windows 进行开发,但是需要 ...

  6. tryhackme-Agent Sudo

    描述:您在深海下发现了一个秘密服务器.你的任务是侵入服务器内部并揭露真相. 枚举 nmap -sV -T4 -v 10.10.123.164 NSE: Script scanning 10.10.12 ...

  7. 如何洞察 C# 程序的 GDI 句柄泄露

    一:背景 1. 讲故事 前段时间有位朋友找到我,说他的程序界面操作起来很慢并且卡顿等一些不正常现象,从任务管理器看了下 GDI句柄 已经到 1w 了,一时也找不出什么代码中哪里有问题,让我帮忙看下,其 ...

  8. go使用 github.com/influxdata/influxdb/client/v2 写数据到 influxdb

    转载请注明出处: 接入示例 使用 github.com/influxdata/influxdb/client/v2 依赖包向 InfluxDB 写入数据的示例代码: package main impo ...

  9. JavaCV的摄像头实战之十三:年龄检测

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<JavaCV的摄像头实战> ...

  10. DevOps|从腾讯TEG CDC解散聊技术中台价值和建设

    近日一则腾讯TEG CDC整个部门解散的消息在很多群里炸了锅,有的唱衰互联网行业,有的唉声叹气,还有的甩锅到 AGI 的发展.总体上来说,这个事情的确已经发生了,我想从组织架构和整体效能这两方面来分析 ...