为什么CF上我的代码的输出和我本地运行/洛谷在线IDE时的输出不一样?
查看原帖
为什么CF上我的代码的输出和我本地运行/洛谷在线IDE时的输出不一样?
597089
zhangyuanxiao楼主2023/7/10 21:30

代码

#include<cmath> 
#include<vector>
#include<iostream>
using namespace std;

const int MAXN=3e5+5;
int n,d,dep[MAXN],fa[MAXN][20];
vector<int> v1,v2;

void init(int u,int v){
    fa[v][0]=u;
    for(int i=1;i<20;i++){
		fa[v][i]=fa[fa[v][i-1]][i-1];
	}
	return;
}

int LCA(int x,int y){
	if(dep[y]>dep[x]) swap(x,y);
	for(int i=19;i>=0;i--){
		if(dep[x]-dep[y]>=pow(2,i)){
			x=fa[x][i];
		}
	}
	if(x==y) return x;
	for(int i=19;i>=0;i--){
		if(fa[x][i]!=fa[y][i]){
			x=fa[x][i];
			y=fa[y][i];
		}
	}	
	return fa[x][0];
}

int dis(int x,int y){
	int lca=LCA(x,y);
	return dep[x]+dep[y]-dep[lca]*2;
}

int main(){
	cin>>n;
	v1.push_back(1);	
	for(int v=2;v<=n+1;v++){
		int u;
		cin>>u;
		dep[v]=dep[u]+1;
		init(u,v);
		int d1,d2;
		if(!v1.empty()) d1=dis(v,v1[0]);
		if(!v2.empty()) d2=dis(v,v2[0]);
		if(max(d1,d2)>d){
			d=max(d1,d2);
			if(d1==d){
				for(int i=0;i<v2.size();i++){
					if(dis(v,v2[i])==d) v1.push_back(v2[i]);
				}
				v2.clear();
			}else{
				for(int i=0;i<v1.size();i++){
					if(dis(v,v1[i])==d) v2.push_back(v1[i]);
				}
				v1.clear();
			}
		}
		if(max(d1,d2)==d){
			if(d1==d) v2.push_back(v);
			else v1.push_back(v);
		}
		cout<<v1.size()+v2.size()<<'\n';
	}
	return 0;
}

样例输入

4
1
1
2
1

CF输出

洛谷在线IDE输出

2023/7/10 21:30
加载中...