Codeforces 1324F Maximum White Subtree DFS
Posted zengzk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 1324F Maximum White Subtree DFS相关的知识,希望对你有一定的参考价值。
题意
给你无根一颗树,每个节点是黑色或白色。对于每一个节点,问包含该节点的权值最大的子树。
子树的权值等于子树中白点的个数减去黑点的个数。
注意,这里的子树指的是树的联通子图。
解题思路
这场就这题卡的比较久。
首先,如果是有根树的话,只需要dfs一遍就能得出根的答案。
设根为1,将无根树转为有根树。对于每一个节点定义(ans)和(val)。
其中,(val_u=sum_{val_v>0且v是u的儿子}{val_v})
然后,再一次dfs就可以获得所有节点的答案。
对于节点(u)和他的父节点(f),他往子节点方向的结果已经确定了,就是(val_u),现在就剩他往(f)方向的结果需要计算。如果(val_u>0),那么往(f)方向的权值就是(ans_f-val_u),否则就是(ans_f)。如果往(f)方向的权值大于0就加到(ans_u)上。
AC代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
#define x first
#define y second
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define endl '
'
const double PI=acos(-1.0);
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int rnd(int l,int r){return l+rng()%(r-l+1);}
namespace IO{
bool REOF = 1; //为0表示文件结尾
inline char nc() {
static char buf[100000], *p1 = buf, *p2 = buf;
return p1 == p2 && REOF && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? (REOF = 0, EOF) : *p1++;
}
template<class T>
inline bool read(T &x) {
char c = nc();bool f = 0; x = 0;
while (c<'0' || c>'9')c == '-' && (f = 1), c = nc();
while (c >= '0'&&c <= '9')x = (x << 3) + (x << 1) + (c ^ 48), c = nc();
if(f)x=-x;
return REOF;
}
template<typename T, typename... T2>
inline bool read(T &x, T2 &... rest) {
read(x);
return read(rest...);
}
inline bool need(char &c) { return ((c >= 'a') && (c <= 'z')) || ((c >= '0') && (c <= '9')) || ((c >= 'A') && (c <= 'Z')); }
// inline bool need(char &c) { return ((c >= 'a') && (c <= 'z')) || ((c >= '0') && (c <= '9')) || ((c >= 'A') && (c <= 'Z')) || c==' '; }
inline bool read_str(char *a) {
while ((*a = nc()) && need(*a) && REOF)++a; *a = '