首页 > 其他分享 >题解:AT_arc116_e [ARC116E] Spread of Information

题解:AT_arc116_e [ARC116E] Spread of Information

时间:2024-07-25 16:42:48浏览次数:6  
标签:ARC116E tim dep 题解 mid dfs int Spread 节点

题目链接

思路

看到最大值最小首先可以想到二分,发现答案具有单调性,那么思考如何在 \(O(n)\) 的时间内判断是否合法。

考虑贪心,在最远没覆盖的点的距离和要判断的 \(mid\) 刚好相等的时侯再选择一定不劣,因为这样覆盖的点最多,那么从叶子节点向上回溯,处理它的所有儿子,判断是否选择该点。

注意事项

  1. 因为一个点也可以被它的儿子覆盖,所以选完一个点以后应该将值设为 \(-mid\) 而不是 \(0\)。

  2. 判断大小时的大小于号最好模一遍样例再确定,不然容易被硬控 2h

  3. 判叶子节点的时候要注意入度为 \(1\) 的点除了叶子节点外,也可能是根节点(可能就我会犯吧)。

  4. 合并到根节点的时候要特判其是否能被覆盖。

  5. 儿子可以被其他儿子内的关键点覆盖。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,k,ans,mid,tim;
int dep[N];
vector<int>v[N];
inline void dfs(int x,int fa)
{
	if(v[x].size()==1&&x!=1) //判叶子 
	{
		dep[x]=1;
		return ;
	}
	dep[x]=-N; //儿子节点的信息 
	int mi=N; // 距离最近的关键点 
	for(auto y : v[x])
		if(y!=fa)
		{
			dfs(y,x);
			dep[x]=max(dep[x],dep[y]);
			mi=min(mi,dep[y]);
		}
	dep[x]+=1; // 加上自己 
	if(dep[x]+mi<=0) // 能否被儿子的关键点覆盖 
		dep[x]=mi+1;
	else if(dep[x]>mid) // 自己是关键点 
	{
		dep[x]=-mid;
		tim++;
	}
	if(x==1&&dep[x]>0) // 特判根节点 
		tim++;
	return ;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n>>k;
	for(int i=2,x,y;i<=n;i++)
	{
		cin>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	int l=1,r=n;
	while(l<=r)
	{
		mid=l+r>>1;
		tim=0;
		dfs(1,0);
		if(tim<=k)
		{
			ans=mid;
			r=mid-1;
		}
		else
			l=mid+1;
	}
	cout<<ans<<"\n";
	return 0;
}

标签:ARC116E,tim,dep,题解,mid,dfs,int,Spread,节点
From: https://www.cnblogs.com/lxyt-415x/p/18323551/zhong-yu-you-neng-wang-xue-shu-li-mian-fang-d

相关文章

  • LG3107 [USACO14OPEN] Odometer S 题解 (数位DP+容斥)
    题意定义一个数是神奇的当且仅当这个数中有一个数位出现了一半及以上,比如112,2233。求\([l,r]\)中有多少个好的数字,\(100\lel,r\le10^{18}\)。题解考虑数位DP,先把答案转为\(Ans(r)-Ans(l-1)\),我们钦定一个数\(k\)让他必须出现多于一半,然后我们想求\([1,x]\)中有多少......
  • CF1015F 题解
    题面考虑这样的匹配问题,可以想如何确定第一次匹配,这样可以不重不漏地计数。考虑dp的时候同时维护有几个括号没有匹配,匹配到\(s\)的第几位,所以令\(f(i,j,k)\)表示dp到(要计数的序列的)第\(i\)个字符,有\(j\)个左括号没有匹配,匹配到\(s\)的第\(k\)位。转移很容易,考......
  • 程序设计:C++入门教程(速成) + 15道经典例题(附带例题解析)
    本文章以实用为主,若实在是不明白文字所表达的内容,无脑复制代码,自己动手运行一下,实验一下即可理解文章内容,放心,代码是全的,全选复制粘贴即可不废话,直接开整数据类型常用数据类型int:整数类型,用于表示整数值。例如:1,2,-3,0等。float:单精度浮点数类型,用于表示带有小数点的数......
  • AT_arc116_e [ARC116E] Spread of Information 题解
    题目传送门前置知识二分答案|树形DP解法答案显然具有单调性,考虑二分答案。设当前二分出的答案为\(mid\),则等价于覆盖距离为\(mid\)的情况下进行选点。做法同luoguP3942将军令,考虑进行贪心,对于深度最深的叶节点将选择的点放在边界时,即取\(mid\)级祖先时,覆盖的范......
  • 题解—[ABC265E] Warp
    题面简单计数DP。由于数据范围很大,所以状态不能常规设置为\(dp_{i,j}\)。注意到\(n\)只有\(300\),考虑设\(dp_{i,j,k}\)表示三种行走方法分别使用\(i\),\(j\),\(k\)次的路径数量。状态转移很简单,先计算出来当前所在位置,如果是障碍就跳过,否则$dp_{i,j,k}=dp_{i-1,j,k}+dp......
  • P2671 [NOIP2015 普及组] 求和 题解
    题目:P2671NOIP2015普及组求和题意给定一个带有颜色和数字的序列,我们要寻找三元组\((x,y,z)\)满足以下条件:\(y\)为\(x\)和\(z\)的中点且都为整数。\(color[x]=color[z]\)。我们命这样一个三元组对答案的贡献为\((x+z)*(num[x]+num[z])\)。整个序列的总价值为每个......
  • Temperature 题解
    前言题目链接:洛谷;SPOJ;Hydro&bzoj。题意简述有一个长度为\(n\)的序列,每个位置值的范围为\([L_i,R_i]\)内,求原序列可能的最长不降子串长度。题目分析尝试找一些性质。发现,连续一段合法的区间,都能分成若干真正参与最长不降子串,以及紧跟着的若干包含\(L_i\)的位置。下图......
  • [ABC318E]Sandwiches 题解
    题意给定一个序列\(A\),要求找有多少个三元组\((i,j,k)\)满足以下条件:\(1\lei<j<k\leN\)\(A_i=A_k\)\(A_i\neA_j\)思路相当于是找每两个相同的元素中有多少个不同的数字。例如:12131答案显然是4,即是\((1,2,3)(1,2,5)(1,4,5)(3,4,5)\)。用\(q[A[i]]\)......
  • [题解]CF117C Cycle
    思路发现最简单的方法就是直接枚举三个点,但是复杂度\(\Theta(n^3)\)无法接受。考虑枚举一个点,并确定它的一条边,那么只需要再枚举一个点了。于是转化为了,对于每一个点找到其最好的出边。观察下图,\(a\toc\)的边是不必要的。因为,如果有一个三元环包含\(a\toc\),那么一定能......
  • P3294 [SCOI2016] 背单词 题解
    题意给你\(n\)个字符串,让你对其进行排列,使得按以下规则花费最少:设当前字符串为\(s\),\(x\)为\(s\)在答案排列中的位置。如果\(s\)存在后缀且\(s\)的后缀在\(s\)之后,花费加\(n^2\)。如果\(s\)不存在后缀则花费加\(x\)。设\(y\)为\(s\)之前离其最近的......