首页 > 其他分享 >CF1842F Tenzing and Tree 题解

CF1842F Tenzing and Tree 题解

时间:2023-09-22 22:22:29浏览次数:39  
标签:Tenzing 个点 黑点 题解 sum Tree int 最优 dis

Tenzing and Tree

感觉很典型的题,就是树的重心+绝对值等式

解法:

以每个点 \(i\) 为根分别 \(bfs\) ,得到一个距离数组 \(dis\) ,取前 \(k\) 个值的权值为和,更新 \(w[k]\) 的值, \(n\) 个点分别为根,更新 \(n\) 遍之后,得到 \(w\) 数组,则 \((n-1)\times i-w[i]\) ,即为 \(i\) 个点时候的答案

下面证明一下正确性:

1、

首先,证明最优解下点一定是联通的,我们可以假设一开始的时候,在树的一个叶子节点上,放了 \(k\) 个黑点,也就是假设一开始没有一个节点上只能放一一个黑点的限制,后续通过我们不断平移, 一次将一个黑点平移到相邻边,使得最终 \(k\) 个黑点分摊在 \(k\) 个树上的真实节点上。

那一开始的时候,总贡献即为 \((n-1)* k\) ,当第一次平移一个点的时候,有一条边的贡献发生了变化,不断的平移,总贡献和就不断的减少。

那假设黑点不是联通的,不妨考虑只差-步的情形,一侧 \(k-1\) 个点是联通的,另-侧1个黑点,且两个连通块之间隔着一个白点,那此时有两条边,满足一侧为 \(n-1\)个黑点,另- -侧为1个点。

如果 \(1\) 个黑点占据了那个白点的位置,则可以使得只有一边,满足一侧为 \(n-1\) 个黑点,另一侧为 \(1\) 个黑点,而刚才的另一条边,变为一侧有 \(n\) 个黑点的情况,即总贡献 \(+2\) 。

通过增量法,我们可以使得差 \(x\) 步可以优化到差 \(x-1\) 步,只差一步 最终优化到联通。

2、

其欺,证明一下刚才的求法能求得最优解, \(w\) 数组对应的最小值,由于是 \(bfs\) 的( \(dfs\) 也可以) ,所以可以还原回树上的黑点连通块,固定根为 \(i\) ,求得的 \(dis\) 数组,选得前 \(k\) 个求和,代表选了 \(k\) 个点。

既可以理解为k个黑点到根的距离和, \(dis=x\) 表示每个点上方有 \(x\) 个点,或者有 \(x\) 条边,也可以理解为所有边对应的子树中的点的数量和,即交换求和顺序,从边的视角来看这个和式。

\[(n-1)* k - \sum dis* 2 \]

\[=(n-k)* k+k* (k-1) -\sum dis* 2 \]

\[=(n-k)* k+ \sum (k) - dis* 2 \]

\[=(n-k)* k+ \sum (k-dis)-dis \]

答案的式子,在求 \(k\) 个黑点的最优解时,

\(\bullet\) \(1.\) 有 \(n-k\) 条边,满足 \(k\) 个点在这些边的一侧,其代价为 \((n-k)*k\) 。

\(\bullet\) \(2.\) 对于两侧都有黑点的这\(k\) 条边来说,后面和式表示非子树点数量和子树点数量和。

而这距离最终的答案还有一个绝对值。

如果是 \((n- k)* k + \sum abs((ki - dis) - dis)\) ,就是我们想要的答案了。

当枚举 \(n\) 个根时,每个根都对应一个局部最优解, \(n\) 个局部最优解的最大值,是最终解,最终解得到的连通块,还是一棵树,不妨称其为最优点树(不唯一) , 而树一定有重心,我们一定可以通过最优黑点树的重心 \(Q\)为根,枚举到某一棵最优黑点树。

此时,根据重心性质,子树大小不超过树总大小的一半,即 \(dis \le k/2\) ,使得 \((k- dis)- dis\) 一定非负,和式等于 \(\sum abs((k - dis) - dis)\) 。

那么其他非最优解的情况,其值只会多减,导致比 \(abs\) 求和小,不会影响最优解。

有类似曼哈顿距离 \(Q\) 的松弛,绝对等式 \(abs(x-y)=max(x+y-2y,x+y-2x)\) ,只要最优解下能和 \(abs\) 取等,其他情况下,算的不是 \(abs\) 也无妨。

代码:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=5e3+100;
int n,u,v;
int dis[N],w[N];
vector<int> e[N];
inline int read(){
	char c=getchar();int f=1,x=0;
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return x*f;
}
void bfs(int u){
	for(int i=1;i<=n;i++) dis[i]=n+1;
	queue<int> q;
	q.push(u);
	dis[u]=0;
	int num=0,sum=0;
	while(!q.empty()){
		u=q.front();
		q.pop();
		num++;
		sum+=dis[u];
		w[num]=min(w[num],sum);
		for(int i=0;i<e[u].size();i++){
			int v=e[u][i];
			if(dis[v]>dis[u]+1){
				dis[v]=dis[u]+1;
				q.push(v);
			}
		}
	}
} 
int main(){
	n=read();
	for(int i=1;i<n;i++){
		u=read();
		v=read();
		e[u].push_back(v);
		e[v].push_back(u);
	}
	memset(w,INF,sizeof(w));
	for(int i=1;i<=n;i++) bfs(i);
	printf("0 ");
	for(int i=1;i<=n;i++) printf("%d ",(n-1)*i-2*w[i]);
	return 0;
}

标签:Tenzing,个点,黑点,题解,sum,Tree,int,最优,dis
From: https://www.cnblogs.com/xuantianhao/p/17723517.html

相关文章

  • 砝码称重 题解
    砝码称重题解前言这道题时限完全可以开到1s,空间也开不到1024kb白想那么多优化(不过这个复杂度可能是目前来看最合理(算出来保证能过)的。题意简述有一个长度为\(n\)的序列\(a\),有两种操作:把\(l\)到\(r\)的所有数改为\(x\);查询用\(l\)到\(r\)的所有数(每个数可......
  • 题解 AtCoder Beginner Contest 267 A~H
    ABC267solutionhttps://atcoder.jp/contests/abc267/ProblemA.Saturday题目描述输入一个表示星期的英文字符串,输出:还有多少天到星期六?solution依题意模拟。\(O(1)\)。ProblemB.Split?题目描述Robin有十个小球,如图排列成这样,然后Robin将一些球击飞了,他告诉你哪些......
  • Django跨域问题解决
    Django跨域问题解决今天在学习前端Vue框架的过程中,遇到了跨域相关问题问题1详情:AccesstoXMLHttpRequestat'http://127.0.0.1:8000/book/'fromorigin'http://localhost:63342'hasbeenblockedbyCORSpolicy:No'Access-Control-Allow-Origin'headerispre......
  • P5836 [USACO19DEC] Milk Visits S - 洛谷题解
     题目链接:[P5836] USACO19DEC] MilkVisitsS-洛谷|计算机科学教育新生态(luogu.com.cn)这道题可以用并查集来解决。题目中每个结点只有两个状态:H和G。那么我们可以推断出,只有当起点和终点间每个结点的状态相同但是起点(或者终点或起点到终点之间的某一点)与所需状态不同......
  • 苏格拉底问答,问题解决
     ......
  • 题解 P8670 [蓝桥杯 2018 国 B] 矩阵求和
    题目描述\[\sum_{i=1}^n\sum_{j=1}^n\gcd(i,j)^2\]具体思路solution1显然可以每次枚举\(\gcd(i,j)\)的取值。\[\sum_{k=1}^nk^2\sum_{i=1}^n\sum_{j=1}^n[\gcd(i,j)=k]\]令\(i=\lfloor\frac{i}{k}\rfloor\),\(j=\lfloor\frac{j}{k}\rfloor\)。\[\sum......
  • 【UVA 11175】From D to E and Back 题解(图论)
    取具有n个顶点和m条边的任意有向图D。你可以在以下方式。E将有m个顶点,每个顶点对应于D的每条边。例如,如果D有一条边uv,那么E将有一个叫做uv的顶点。现在,每当D有边uv和vw时,E就会有边顶点uv到顶点vw。E中没有其他边。你将得到一张E图,并且必须确定E是否有可能是某些有向图D的图的卧......
  • CF38H 题解
    problem&blog。远古场翻到的一个不错的题,提供一个好想很多的做法。求出任意两点的路径在全部路径中是第几个。然后随便找两个人,钦定他们是Au吊车尾与CuRank1。这样子就可以直接求出全部人可以是否可以拿AuAgCu了。然后就是傻子DP了,往状态里塞Au与Ag的人数,转移......
  • MUH and Cube Walls 题解
    MUHandCubeWalls前言怎么题解区同质化这么严重,16篇题解全是差分+KMP,就没有人写别的做法吗。(好吧其实是我一开始没想到差分才有了这么多奇怪做法)题目大意给定两个序列\(a,b\),求\(b\)在\(a\)中出现了多少次。我们定义\(b\)在\(a\)的出现次数为:\[\sum_{i=1}^n......
  • c#Winform窗体实际运行大小与size属性设置不一致问题解决
    privatevoidForm1_Load(objectsender,EventArgse){RectangleScreenArea=System.Windows.Forms.Screen.GetWorkingArea(this);//GetWorkingArea()检索显示器的工作区(工作区是显示器的桌面区域,不包括边界、标题栏、任务栏、停靠窗口和停靠......