首页 > 其他分享 >【CF1842F】Tenzing and Tree

【CF1842F】Tenzing and Tree

时间:2023-06-27 20:33:14浏览次数:50  
标签:rt cnt Tenzing CF1842F int Tree times 黑点 neq

题目

题目链接:https://codeforces.com/contest/1842/problem/F
给定一棵 \(n\) 个点的树,你可以选择其中 \(k\) 个点染黑,定义一条边的价值为割去这条边之后,剩下两颗树的黑点数量差;一棵树的价值为所有边的价值之和。
对于 \(k\in [0,n]\),求出树的价值的最大值。
\(n\leq 5000\)。

思路

不妨设点 \(rt\) 为根,设 \(cnt[i]\) 表示以 \(i\) 为根的子树内的黑点数量。那么如果染 \(k\) 个黑点,答案就是

\[\sum^{}_{i\neq rt}\left |(k-cnt[i])-cnt[i]\right |=\sum^{}_{i\neq rt}\left |k-2\times cnt[i]\right | \]

这个绝对值很讨厌,但可以发现,如果点 \(rt\) 是所有黑点的重心的话,那么对于所有的 \(cnt[i]\ (i\neq rt)\),都一定满足 \(2\times cnt[i]\leq k\),此时答案就是

\[(n-1)\times k - 2\times \sum_{i\neq rt}cnt[i] \]

我们发现如果选择点 \(x\) 染黑,那么从 \(x\) 的父亲到 \(rt\) 上所有点的 \(cnt\) 都要加一。那么为了最大化答案,我们只需要选择深度最小的 \(k\) 个节点染黑即可。
只需要枚举每一个点作为 \(rt\),然后 BFS 计算所有 \(k\) 的答案即可。即使目前枚举的点不是重心也没关系,因为这样就会导致有些 \(k-2\times cnt<0\),不会比最优答案大。
时间复杂度 \(O(n^2)\)。

代码

#include <bits/stdc++.h>
using namespace std;

const int N=5010;
int n,dep[N],ans[N];
vector<int> e[N];
queue<int> q;

int main()
{
	scanf("%d",&n);
	for (int i=1,x,y;i<n;i++)
	{
		scanf("%d%d",&x,&y);
		e[x].push_back(y); e[y].push_back(x);
	}
	printf("0 %d",n-1);
	memset(ans,0x3f3f3f3f,sizeof(ans));
	for (int i=1;i<=n;i++)
	{
		memset(dep,-1,sizeof(dep));
		q.push(i); dep[i]=0;
		int res=0,cnt=1;
		while (q.size())
		{
			int u=q.front(); q.pop();
			for (auto v:e[u])
				if (dep[v]==-1)
				{
					dep[v]=dep[u]+1; res+=dep[v];
					cnt++; ans[cnt]=min(ans[cnt],res);
					q.push(v);
				}
		}
	}
	for (int i=2;i<=n;i++)
		printf(" %d",(n-1)*i-2*ans[i]);
	return 0;
}

标签:rt,cnt,Tenzing,CF1842F,int,Tree,times,黑点,neq
From: https://www.cnblogs.com/stoorz/p/17509867.html

相关文章

  • TreeSaver 图片的定位
    Treesaver是浏览器大小尺寸敏感(size-sensitive)的,会就着当前的浏览器尺寸(browsersize),选用不同的分栏表格(grid)做排版。不同排版效果下,图片出现的位置有啥规律,这就是本文要分析的内容: 一些典型的图片出现的规律:首先我们看一些图片出现的规律:一、当显示的区域只有两栏时,显示另外一个......
  • TreeSaver 使用教程整理——Step 4: Using a Title Figure
    请首先阅读前几篇教程,才能对本篇文章了解比较深入:TreeSaver使用教程整理——Step1:GettingStartedTreeSaver使用教程整理——Step2:AddingBasicUITreeSaver使用教程整理——Step3:CreatingGrids我们在第二步的基础上,copy到step4作为我们step4初始的基础。 Step4......
  • TreeSaver 使用教程整理——Step 3: Creating Grids
    请首先阅读前几篇教程,才能对本篇文章了解比较深入:TreeSaver使用教程整理——Step1:GettingStartedTreeSaver使用教程整理——Step2:AddingBasicUI我们在第二步的基础上,copy到step3作为我们step3初始的基础。 Step3:CreatingGrids模板文件resources.html的变化在......
  • TreeSaver 使用教程整理——Step 2: Adding Basic UI
    请首先阅读前一篇教程:TreeSaver使用教程整理——Step1:GettingStartedStep2:AddingBasicUI我们上一步实现的网页有了一个最最简单的功能,这一步我们将在上一步基础上添加切换分页的按钮以及显示当前页面信息。请Copy上一步的内容,并对下面文件做如下修改: 对资源文件(resource......
  • TreeSaver 使用教程整理——Step 1: Getting Started
    TreeSaver介绍Treesaver是一个开源的JavaScript框架,用来创建杂志风格的网页布局。 为何要整理这个系列的文章下面的教程整理自:https://github.com/Treesaver/treesaver/wiki/Walkthrough,也许是这个框架目前才刚刚起步,它的文档很成问题,文档中一些链接不能下载,源代码中欠缺一......
  • TreeSelect 树形选择 选中子级显示所有父级及本身
    由于需求的需要,需要在选中二级的时候,将全部路径完整的在输入框显示:如图所示 看了一下,tree自带的属性没有此功能,经过一番思考,直接可以给绑定的model赋值的操作实现,代码如下:<template><el-tree-select:disabled='props.disabled'ref='treeRef'node-key='value':props="t......
  • CodeTON Round 5 (Div. 1 + Div. 2, Rated, Prizes!) C. Tenzing and Balls
    一开始以为是贪心,后来发现不好贪于是选择了dp,但是dp有个小细节没注意到,后面wa了几发我们以状态来分,f[i]表示考虑i的最大区间合长度,每次转移的时候考虑两种情况,一种是a[i]前面有一样的数字,比较选了a[i]和不选a[i]两种情况下的最大值,还有一种就是a[i]为第一个出现的数字则选区间长......
  • h2database BTree 设计实现与查询优化思考
    h2database是使用Java编写的开源数据库,兼容ANSI-SQL89。即实现了常规基于BTree的存储引擎,又支持日志结构存储引擎。功能非常丰富(死锁检测机制、事务特性、MVCC、运维工具等),数据库学习非常好的案例。本文理论结合实践,通过BTree索引的设计和实现,更好的理解数据库索引相关的......
  • [数据结构]Binary Indexed Trees(树状数组)
    BinaryIndexedTrees(树状数组)1.lowbitlowbit(x)是x的二进制表达式中最低位的1所对应的值。比如,6的二进制是110,所以lowbit(6)=2。lowbit(x)=x&(-x)2.定义,查询,修改(eg1)\(a1,a2,...,an\)能在BZ的时间复杂度下完成:单点加,\(ai+=d\)查询前缀和\(\sum_{i=1}^{x}ai......
  • [数据结构]Segment tree(线段树)
    Segmenttree(线段树)1.线段树的结构和思想线段树基本结构:简单操作:1.单点修改:时间复杂度O(logn),因为线段树高是O(logn)的,然后会修改这个点到根的路径上的点权,所以是O(logn)的。2.区间查询(比如:最小值)实现:#include<bits/stdc++.h>usingnamespacestd;typedeflong......