首页 > 其他分享 >CF1776M Parmigiana With Seafood 题解

CF1776M Parmigiana With Seafood 题解

时间:2023-07-25 21:00:11浏览次数:37  
标签:Parmigiana int 题解 Seafood mid text vec ans dis

先将所有的叶子取 \(\max\) 贡献给答案,以下讨论的所有点中不考虑叶子。

首先可以考虑先手能否删到 \(n\):不难发现当 \(2 \mid n\) 的时候可以,然后我们就排除了一半的 \(n\),于是以下令 \(2 \not \mid n\)。接下来,考虑先手能否删掉 \(n-1\),那么把 \(n-1 \to n\) 的路径当成一个大点,容易发现当 \(2\not \mid \text{dis}_{n-1,n}\) 的时候才能删掉 \(n-1\)。也就相当于对于任意二元组 \((x,y)\) ,满足 \(2\not\mid\text{dis}_{x,y}\),\(\min\{x,y\}\) 必定可以贡献给答案。

由于上面解决了距离为奇数的所有点对,那么以下考虑的点中两两距离为偶数。

考虑树上两两距离为偶数的点所构成的虚树,直接做不好入手,不妨直接考虑三个点构成的虚树。那么这相当于共线的三个点或者满足 \(\exist u,2 \mid \text dis_{u,x},2 \mid \text dis_{u,y},2 \mid \text dis_{u,z}\) 或者 \(\exist u,2 \not \mid \text dis_{u,x},2 \not\mid \text dis_{u,y},2 \not\mid \text dis_{u,z}\) 的三元组 \((x,y,z)\)。考虑后面两者,其中后者必定可以取到 \(\min \{u,\max\{x,y,z\}\}\),这在之前已经讨论过,那么现在考虑前者。

发现这个东西的贡献直接就是 \(\min\{x,y,z\}\),这是因为图上除了这个虚树之外的点的个数为偶数,那么由于它有 \(3\) 个叶子,删剩这个虚树以及叶子上挂的 \(3\) 个点的时候删的步数必定是奇数,那么下一步后手必定会暴露出一个叶子,先手直接删掉即可。

进一步,可以发现树上两两距离为偶数的点所构成的虚树必定可以以若干个三元组 \((x,y,z)\) 的形式考虑,那么我们很可能已经考虑了所有可能的答案,接下来只需证明对于所有满足集合内任意两点距离为偶数并且任意三点不构成上面的三元组 \((x,y,z)\) 的点集 \(S\),后手可以拿走里面所有的点即可。

根据上面的分讨,这种情况当且仅当 \(S\) 中的任意三点共线且两两距离为偶数,那么这就相当于一条长度为偶数的一条链上的几个距离为偶数的点,那么结论的正确性就是显然的。

所以现在的答案就是所有的满足前面条件的二元组 \((x,y)\) 的 \(\min\{x,y\}\) 和三元组 \((x,y,z)\) 的 \(\min\{x,y,z\}\) 的最大值。至此,通过二分答案 \(x\) 并单次 \(O(n)\) 判断 \(\geq x\) 的所有点是否可以构成任意一个点集,我们获得了一个 \(O(n \log n)\) 的一个做法,已经可以通过。

但是通过不知道怎么想到地额外发掘一些性质,存在一个线性做法:所有的点集必定形如 \((n,x),(n,x,y),(x,y,z)\) ,其中最后一种满足 \(u=n\)。前两种显然,考虑证明最后一种:如果存在一个不满足条件的三元组 \((x,y,z)\) ,那么一定满足 \((n,x),(n,y),(n,z),(x,y),(y,z),(z,x)\) 这几个点对的距离全部为偶数,简单分讨可知 \((n,x,y)\) 必定也是一个满足条件的点集。

所以直接以 \(n\) 为根进行一次 dfs 即可,复杂度 \(O(n)\)。

代码:

const int N=1e5+50;
int n,f[N][2],dep[N],deg[N],head[N],cnt,ans,pos1,pos2; 
struct edge{int to,nxt;}e[N<<1];
vector<pair<int,int> > vec;
inline void addedge(int u,int v){e[++cnt]=(edge){v,head[u]},head[u]=cnt;}
void dfs(int u,int fa,int id)
{
	dep[u]=dep[fa]+1,f[u][0]=(deg[u]>1)?u:0;
	if(dep[u]&1) ans=max(ans,u);
	else if(deg[u]>1) vec.emplace_back(MP(u,id));
	int maxn1=0,maxn2=0;
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(v==fa) continue;
		dfs(v,u,id),f[u][0]=max(f[u][0],f[v][1]),f[u][1]=max(f[u][1],f[v][0]);
		if(f[v][1]>=maxn1) maxn2=maxn1,maxn1=f[v][1];
		else if(f[v][1]>maxn2) maxn2=f[v][1];
	}
	if(!(dep[u]&1)) ans=max(ans,min(maxn1,maxn2));
}
int main(void)
{
	n=read();int u,v;
	fr(i,2,n) u=read(),v=read(),addedge(u,v),addedge(v,u),++deg[u],++deg[v];
	if(!(n&1)) return writeln(n),0;
	fr(i,1,n) if(deg[i]==1) ans=max(ans,i);
	for(int i=head[n];i;i=e[i].nxt) dfs(e[i].to,n,e[i].to);
	sort(vec.begin(),vec.end());int sz=vec.size();
	pfr(i,sz-1,0)
	{
		if(!pos1) pos1=vec[i].sec;
		else if((!pos2)&&vec[i].sec!=pos1) pos2=vec[i].sec;
		else if(vec[i].sec!=pos1&&vec[i].sec!=pos2){ans=max(ans,vec[i].fir);break;}
	}
	return writeln(ans),0;
}

标签:Parmigiana,int,题解,Seafood,mid,text,vec,ans,dis
From: https://www.cnblogs.com/lgj-lgj/p/17580994.html

相关文章

  • 洛谷 P9221 「TAOI-1」Pentiment 题解
    Description给定\(n\timesm\)的矩阵,从第\(1\)行任意格子出发,每次向下、左、有走一步,有\(q\)个障碍不能经过,求走到第\(n\)行任意格子的方案。对于所有数据,\(1\leqn,m\leq10^9\),\(1\leqq\leq10^5\)。link:https://www.luogu.com.cn/problem/P9221Solution算法一考......
  • 题解 LGP2300【合并神犇】
    Problem随机\(n\)个正整数组成序列。将序列分尽量多的段数,使得前一段的和不大于后一段的和。求能分成多少段。输出\(n-ans\)。\(n\leq10^5\),值域不重要。Solution状态设计为:\(f_i=1+\min_{sum_i-sum_j\geqg_j}f_j\)表示前\(i\)个数字划分的最多段数,\(g_j\)定义为\(f_......
  • 洛谷P3629 [APIO2010] 巡逻题解
    题目链接P3629[APIO2010]巡逻-洛谷|计算机科学教育新生态(luogu.com.cn)思路n个村庄,n-1条道路,原图为树1.若k=0(不修建道路)那么答案为(n-1)*2 每个道路会走两遍2.若k为1(修建一条道路)设修建的道路(r1)所在的环长度为L那么答案为(n-1)*2-L+2可以看到r1所在环的道路只走了......
  • 题解 P1150 【Peter的烟】
    postedon2020-11-1410:00:20|under题解|source2023编者注:本篇题解的方法过于暴力,但是尊重历史。请不要太在意。—-教你们用栈做这道题原题传送门看到这题,第一反应是用stack做。我们可以把Peter手上的烟看作一个栈,一根烟就是一个元素,抽了\(n\)支烟就从栈里pop几个,......
  • 题解 P1008 【三连击】
    postedon2020-11-1217:25:10|under题解|source2023编者注:请尊重历史。本题正解是暴力枚举先引用我们老师的一句话:(无恶意)不会吧不会吧,不会还有人不会写三连击吧!废话不多说,开始解题:理解题目和做题思路P1008三连击题目链接:https://www.luogu.com.cn/problem/......
  • 题解 CF1501A 【Alexey and Train】
    postedon2021-03-1321:57:02|under题解|source简单模拟题,考验选手的读题能力和使用谷歌翻译的能力。先定义一个\(now=0\),我们最后算出来的结果为\(now\)。对于每个站(不包括第\(n\)站),我们需要加上\(3\)个部分:额外时间,now+=ex[i];第\(i-1\)站到第\(i\)站的时......
  • 题解 CF1501B 【Napoleon Cake】
    postedon2021-03-1617:42:06|under题解|source题目可以转化一下:给一个长为\(n\)的数组\(a\),请求出一个长为\(n\)的数组\(b\)。要求若\(a_i\)不为\(0\),则\([b_{i-a_i+1},b_i]\)这个区间要为\(1\)。知道这个题目意思就好办了。题目说\(n\leq2\times10^5\),......
  • 题解 CF1497C2 【k-LCM (hard version)】
    postedon2021-03-2009:09:40|under题解|source2023编者注:有一些链接点不进去,分别是cf1497c1的cf页面和https://www.cnblogs.com/caijianhong/p/Solution-cf1497c1.html此题与CF1497C1有异曲同工之妙。我们知道,\(\operatorname{lcm}(1,x)=x\),不难想到,\(\operato......
  • 题解 CF1497C1 【k-LCM (easy version)】
    postedon2021-03-2008:26:53|under题解|source看数据范围,\(1\leqT\leq10^4\),\(1\leqn\leq10^9\),显然是构造题。我们分三类讨论:\(n\bmod2=1\):显然可以先提出一个\(1\),再把\(n-1\)分成两半,\(\operatorname{lcm}(1,\frac{n-1}{2},\frac{n-1}{2})=\frac{n-1}{2}\le......
  • 题解 P7679 【[COCI2008-2009#5] JABUKA】
    postedon2021-07-0717:38:14|under题解|source设题目中分给每个朋友的苹果数为\(x\),显然有\(x\vertr\landx\vertg\),也就是\(x\vert\gcd(r,g)\)。我们都知道,如果\(a\timesb=c\),那\(a\)和\(b\)都是\(c\)的因数,也就是说因数都是成对出现的(注意特判完全平方......