首页 > 其他分享 >CF842E Nikita and game 题解

CF842E Nikita and game 题解

时间:2023-07-02 18:44:39浏览次数:41  
标签:distance anc int 题解 Nikita len dep CF842E dis

题意

一棵树初始只有一个编号为 1 的根结点。

\(n\) 次操作,每次新增一个点作为 \(p_i\) 的子结点,询问更新后有多少点可以作为树直径的端点。

\(n\le3\times10^5\)。

题解

以下 \(dist(x,y)\) 表示点 \(x\) 与点 \(y\) 在树上的距离。

不难发现若干条直径必然叠合于至少一点,任选这些交点中的一点划开,维护该点左部可能成为直径端点的点集 \(L\) 与该点右部可能成为直径端点的点集 \(R\) 。

那么对于 \(L,R\) 需要满足从 \(L\) 中任取一点 \(L_0\) , \(R\) 中任取一点 \(R_0\) ,\(dist(L0,R0)=直径长度\) 。

加点的时候动态维护 \(L,R\) 集合即可。

假设当前加入点 \(x\) ,我们从 \(L\) 中任取一点 \(L_0\) , \(R\) 中任取一点 \(R_0\) ,计算 \(dist(x,L_0)=dis\_L,dist(x,R_0)=dis\_R\)。

若 \(max(dis\_L,dis\_R)<直径长度\) ,无事发生。

若 \(max(dis\_L,dis\_R)=直径长度\) ,那么若 \(dis\_L=直径长度\) ,将 \(x\) 加入 \(R\) ,另一种情况是类似的。

若 \(max(dis\_L,dis\_R)>直径长度\) ,那么用较大的更新直径长度,若使用 \(dis\_L\) 更新直径长度,那么将 \(x\) 加入点集 \(R\) ,

同时对于原点集 \(R\) 中的点,若其与 \(x\) 距离也为 \(dis\_L\) ,加入点集 \(L\) ,否则将这个点删去。

另一种情况是类似的。

每次询问的答案即为两个点集各自的大小之和。

点集 \(L,R\) 开两个 \(vector\) 维护即可。

不难发现每个点最多在 \(L,R\) 中各出现一次,不可能在任意一个点集中出现第二次,证明考虑反证法即可,因此时间复杂度是 \(O(n)\) 的。

代码

#include<bits/stdc++.h>
#define For(i,l,r) for(int i=(l);i<=(r);++i)
#define ReFor(i,r,l) for(int i=(r);i>=(l);--i)
const int N=300010;
using namespace std;
int n,len;
int dep[N],anc[N][20];
vector<int> L,R;
void add(int x,int fa_x)
{
	dep[x]=(dep[fa_x]+1);
	anc[x][0]=fa_x;
	For(i,1,19)
		anc[x][i]=anc[anc[x][i-1]][i-1];
	return;
}
int LCA(int x,int y)
{
	if(dep[x]<dep[y])
		swap(x,y);
	ReFor(i,19,0)
	{
		if(dep[anc[x][i]]>=dep[y])
			x=anc[x][i];
	}
	ReFor(i,19,0)
	{
		if(anc[x][i]!=anc[y][i])
		{
			x=anc[x][i];
			y=anc[y][i];
		}
	}
	if(x==y)
		return x;
	else
		return anc[x][0];
}
int Distance(int x,int y){return (dep[x]+dep[y]-(2*dep[LCA(x,y)]));}
int main()
{
	scanf("%d",&n);
	{
		len=0;
		dep[0]=0;
		add(1,0);
		L.clear();
		R.clear();
		L.push_back(1);
	};
	For(_,1,n)
	{
		int i=(_+1),fa;
		scanf("%d",&fa);
		add(i,fa);
		int distance_L=0,distance_R=0;
		if(!L.empty())distance_L=Distance(i,L[0]);
		if(!R.empty())distance_R=Distance(i,R[0]);
		int maxx=max(distance_L,distance_R);
		if(maxx==len){if(len==distance_L)R.push_back(i);else if(len==distance_R)L.push_back(i);}
		if(maxx>len)
		{
			len=maxx;
			if(len==distance_L)
			{
				for(auto id:R)
				{
					if(Distance(id,i)==len)
						L.push_back(id);
				}
				R.clear();
				R.push_back(i);
			}
			else if(len==distance_R)
			{
				for(auto id:L)
				{
					if(Distance(id,i)==len)
						R.push_back(id);
				}
				L.clear();
				L.push_back(i);
			}
		}
		int ans=(L.size()+R.size());
		printf("%d\n",ans);
	}
	return 0;
}

标签:distance,anc,int,题解,Nikita,len,dep,CF842E,dis
From: https://www.cnblogs.com/llzer/p/17521179.html

相关文章

  • Codeforces Round 881 Div2 A-F1题解
    codeforcesround881div2题解马上要秋招了,自己本事全丢了,感觉如果这样的话今年就估计要饿死了。先打div3,7月份得开始收心了A.SashaandArrayColoring题意,可以分任意组,每组的贡献是max-min,问最大贡献显然是贪心,从大到小配对一下就行,不想放代码了’B.LongLong给出一......
  • JSON中,java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher问题解决
    使用JSON,在SERVLET或者STRUTS的ACTION中取得数据时,如果会出现异常:java.lang.NoClassDefFoundError:net/sf/ezmorph/Morpher是因为需要的类没有找到,一般,是因为少导入了JAR包,使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-bean......
  • dpkg-reconfigure命令找不到问题解决
    作者: adminhttps://cloudbool.com/archive/dpkg-reconfigure-command-not-found.html今天在SSH远程连接到服务器时,遇到了dpkg-reconfigure命令找不到的问题,觉得很是奇怪,花了点时间研究下,这里做个记录,以备后用。前情提要我远程的服务器系统是自行使用DebiannetinstISO镜......
  • [ABC306] C/D 题解
    C.Centers 参考算法统计,排序\(\rmSyx\)给你\(3\timesN\)个数,其中\(\rmSyx\)可以保证:\(1\simN\)之间的所有数都出现了\(3\)次,请你将\(1\simN\)之间的数每个出现在第\(2\)个位置的下标进行排序,并从小到大输出原数。用\(\rmmap\)记录数出现的次数,......
  • 【题解】#119. 最大整数 题解(2023-07-01更新)
    #119.最大整数题解题目传送门更新日志2023-05-2617:20文章完成2023-05-3015:22文章审核通过2023-07-0116:04修改了代码题目知识点字符串+贪心题意说明设有n个正整数($n<20$),将它们连接成一排,组成一个最大的多位整数。(题目简介明了,一看就是出题人懒得写题目背景)......
  • 【题解】P8679 [蓝桥杯 2019 省 B] 填空问题 题解
    P8679[蓝桥杯2019省B]填空问题题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-05-2521:02文章完成2023-05-2711:34文章通过审核2023-06-2021:03优化了文章代码格式试题A:组队【解析】本题是一道经典的DFS搜索题,每次对各号位的选手进行DFS,......
  • 【题解】P8741 [蓝桥杯 2021 省 B] 填空问题 题解
    P8741[蓝桥杯2021省B]填空问题题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-05-0923:19文章完成2023-05-0923:20通过审核2023-06-2021:03优化了文章代码格式试题A:空间【解析】本题考察计算机存储的基础知识,只要掌握空间存储的换算方法,就能......
  • 【题解】P8684 [蓝桥杯 2019 省 B] 灵能传输 题解
    P8684[蓝桥杯2019省B]灵能传输题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-06-2021:46文章完成【解析】本题涉及到了$3$种算法:前缀和,排序以及贪心(1)前缀和本题实际上要求通过某种灵能传输可以使得该序列的最大值最小。而由前缀和可知,当某一个前......
  • 【置顶】FZQOJ题解集(2023-07-01更新)
    #68.「NOIP2004」津津的储蓄计划题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-02-0117:20文章完成2023-02-0316:09文章审核通过2023-02-0422:15修改了注释2023-05-2709:27修改了$\LaTeX$2023-07-0115:45修改了代码题目知识点模拟题目分析......
  • 【置顶】luogu题解集(2023-07-01更新)
    P8679[蓝桥杯2019省B]填空问题题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-05-2521:02文章完成2023-05-2711:34文章通过审核2023-06-2021:03优化了文章代码格式试题A:组队【解析】本题是一道经典的DFS搜索题,每次对各号位的选手进行DFS,......