首页 > 其他分享 >CF1324F Maximum White Subtree

CF1324F Maximum White Subtree

时间:2024-12-22 19:27:59浏览次数:9  
标签:CF1324F dp1 int max Maximum 节点 White col dp


看到题目最直接的想法就是以每个节点为根进行 n n n 次树形 d p dp dp。因为以节点 u u u 为根时我们只需要考虑把树的某些"分杈"剪去,而不用关心 u u u 节点是否被包含在某个子树中。

但时间复杂度是 O ( n 2 ) O(n^2) O(n2),所以考虑换根 d p dp dp。


换根 d p dp dp

  1. 若一个节点是黑色,那么就让 c o l [ i ] = − 1 col[i] = -1 col[i]=−1,不然就让 c o l [ i ] = 1 col[i] = 1 col[i]=1。

  2. 以 1 1 1 为根 d f s dfs dfs 求出每个节点答案的"一部分"(真正的答案来自每个节点的所有子节点它的父节点,这里"一部分"是指构成每个节点正确答案的子节点部分)。很显然转移方程为:
    d p 1 [ u ] = c o l [ u ] + ∑ v ∈ s o n [ u ] m a x ( 0 , d p 1 [ v ] ) dp1[u] = col[u] + \sum_{v \in son[u]}{max(0, dp1[v])} dp1[u]=col[u]+v∈son[u]∑​max(0,dp1[v])
    之所以 d p 1 [ v ] dp1[v] dp1[v] 要与 0 0 0 取 m a x max max 是因为若这部分子树贡献为负数,我肯定会把它"剪去"。

  3. 再次 d f s dfs dfs 进行 d p dp dp,进行换根。转移方程为:
    d p 2 [ u ] = d p 1 [ u ] + m a x ( 0 , d p 2 [ f a ] − m a x ( 0 , d p 1 [ u ] ) ) dp2[u] = dp1[u] + max(0, dp2[fa] - max(0, dp1[u])) dp2[u]=dp1[u]+max(0,dp2[fa]−max(0,dp1[u]))
    f a fa fa 为第一次 d f s dfs dfs 中, u u u 的父节点。


代码

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int maxn = 2e5 + 7;
const int inf  = 0x3f3f3f3f;

int n, col[maxn];
vector<int> e[maxn];
int fa[maxn];
int dp1[maxn], dp2[maxn];
void dfs1(int u, int f) {
	fa[u] = f, dp1[u] = col[u];
	for (int v : e[u]) {
		if (v == f) continue;
		dfs1(v, u);
		dp1[u] += max(0, dp1[v]);
	}
}
void dfs2(int u, int f) {
	dp2[u] = max(0, dp2[fa[u]] - max(0, dp1[u])) + dp1[u];
	for (int v : e[u]) {
		if (v == f) continue;
		dfs2(v, u);
	}
} 
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
    	int v; scanf("%d", &v);
    	if (v) col[i] = 1;
    	else col[i] = -1;
	}
    for (int i = 1; i < n; ++i) {
    	int u, v;
    	scanf("%d%d", &u, &v);
    	e[u].push_back(v);
    	e[v].push_back(u);
	}
	dfs1(1, 0);
	dfs2(1, 0);
	for (int i = 1; i <= n; ++i)
	    printf("%d ", dp2[i]);
	return 0;
} 

标签:CF1324F,dp1,int,max,Maximum,节点,White,col,dp
From: https://blog.csdn.net/m0_72761451/article/details/144650970

相关文章

  • 为什么在生成静态页或上传附件时出现“Maximum execution time of 30 seconds exceede
    在使用易优EyouCms生成静态页或上传附件时,如果遇到“Maximumexecutiontimeof30secondsexceeded”的错误提示,这通常是因为服务器上的PHP脚本执行时间超过了默认的最大执行时间限制。默认情况下,PHP的 max_execution_time 设置为30秒,这意味着如果脚本执行时间超过30秒,将会被......
  • Maximum Area Rectangle With Point Constraints II
    MaximumAreaRectangleWithPointConstraintsIITherearenpointsonaninfiniteplane.YouaregiventwointegerarraysxCoordandyCoordwhere(xCoord[i],yCoord[i])representsthecoordinatesoftheithpoint.Yourtaskistofindthemaximum areaof......
  • [LeetCode] 2684. Maximum Number of Moves in a Grid
    Youaregivena0-indexedmxnmatrixgridconsistingofpositiveintegers.Youcanstartatanycellinthefirstcolumnofthematrix,andtraversethegridinthefollowingway:Fromacell(row,col),youcanmovetoanyofthecells:(row-1,col+......
  • 举例说说你对white-space属性的理解
    white-space属性控制如何处理元素中的空白字符,包括空格、制表符和换行符。它在前端开发中用于控制文本的渲染方式,特别是在处理多行文本或需要保留空格格式时非常有用。以下是一些white-space属性值的示例及其效果:normal(默认值):连续的空白字符会被合并成一个空格,换行符......
  • CF2050F Maximum modulo equality 题解
    【题意简述】你有一个长度为\(n\)的数组\(a\)。每一次询问给定\(l,r\),寻找最大的\(m\)使得\(a_l\)到\(a_r\)的所有数对\(m\)同余,【前置数学芝士】首先是一个非常Naive的结论,请自行感性证明:设\(a>b\),\(a\)和\(b\)对\(a-b\)同余。理性证明:设\(p=a-b\),\(......
  • E86 换根DP CF1324F Maximum White Subtree
    视频链接:E86换根DPCF1324FMaximumWhiteSubtree_哔哩哔哩_bilibili  MaximumWhiteSubtree-洛谷|计算机科学教育新生态//换根DPO(n)#include<bits/stdc++.h>usingnamespacestd;constintN=200005;vector<int>e[N];intn,a[N],f[N];voiddfs(int......
  • Maximum execution time of 30 seconds exceeded
    遇到 Maximumexecutiontimeof30secondsexceeded 这个错误,通常是因为PHP脚本执行时间超过了设定的最大执行时间限制。这可能是由于脚本执行了耗时的操作,例如长时间的数据库查询或其他资源密集型任务。以下是一些解决步骤:1.增加最大执行时间限制可以在PHP配置文件(ph......
  • 题解:SP3693 KGSS - Maximum Sum
    原题传送门思路分析线段树。这道题让我们进行两种操作,分别是单点修改和区间查询,结合数据范围,很明显是一道线段树。区间里最大的\(A_i+A_j\),其实就是求区间里的最大值和次大值,我们用线段树维护最大值和次大值。建树voidbuild(intnow,inttl,inttr){ if(tl==tr){ tmax......
  • 浙大数据结构:01-复杂度2 Maximum Subsequence Sum
    数据结构MOOCPTA习题01-复杂度2MaximumSubsequenceSum#include<iostream>usingnamespacestd;constintM=100005;inta[M];intmain(){ intk; cin>>k; intf=1; for(inti=0;i<k;i++) { cin>>a[i]; if(a[i]>=0)//如......
  • CSS3 文本效果(text-shadow,box-shadow,white-space等)文本溢出隐藏并且显示省略号
    一text-shadowtext-shadow属性是CSS3中用于为文本添加阴影效果的工具。它可以增强文本的可读性和视觉吸引力,提供丰富的视觉效果1语法text-shadow:offset-xoffset-yblur-radiuscolor;offset-x:阴影相对于文本的水平偏移量。可以是正值(向右偏移)或负值(向左偏移)。o......