为什么交程序之后输入不一样
  • 板块学术版
  • 楼主yyz1005
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/9/26 13:33
  • 上次更新2023/11/2 18:02:52
查看原帖
为什么交程序之后输入不一样
220824
yyz1005楼主2023/9/26 13:33

一道 CF 题,本地过了样例,在 CF 上输出了一些奇妙数据

似乎也没 UB 啊

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 300010;
ll n;
vector<ll> s,t;
ll anc[N][30],dep[N];
ll d = 0;
void add(ll id,ll fa){
	anc[id][0] = fa;dep[id] = dep[fa]+1;
	for(ll j = 1; (1<<j)<=dep[id]; j++){
		anc[id][j] = anc[anc[id][j-1]][j-1];
	}
}
ll lca(ll u,ll v){
	if(dep[v]>dep[u]) swap(u,v);
	for(ll j = 25; j >= 0&&dep[u]>dep[v]; j--){
		if((1<<j)<=dep[u]&&dep[u]-(1<<j)>=dep[v]) u = anc[u][j];
	}
	//u = v;
	if(u==v) return u;
	for(ll j = 25; j >= 0; j--){
		if((1<<j)>dep[u]) continue;
		if(anc[u][j]!=anc[v][j]) u = anc[u][j],v = anc[v][j];
	}
	return anc[u][0];
}
ll dis(ll x,ll y){
	/*
	printf("Ask distance %lld[%lld] <-> %lld[%lld]  ",x,dep[x],y,dep[y]);
	printf("Lca = %lld[%lld]\n",lca(x,y),dep[lca(x,y)]);
	printf("So, result = %lld\n",dep[x]+dep[y]-2*dep[lca(x,y)]);
	*/
	return dep[x]+dep[y]-2*dep[lca(x,y)];
}
int main(){
	scanf("%lld",&n);
	dep[1] = 0;
	s.push_back(1);
	for(ll id = 2; id <= n+1; id++){
		ll u;
		scanf("%lld",&u);
		add(id,u);
		ll dis1 = 0,dis2 = 0;
		if(!s.empty()) dis1 = max(dis1,dis(id,s[0]));
		if(!t.empty()) dis2 = max(dis2,dis(id,t[0]));
		//printf("New Node:%lld   dis1 = %lld,dis2 = %lld\n",id,dis1,dis2);
		if(dis1>d||dis2>d){
			//printf("New Strength[d = %lld]\n",d);
			d = max(dis1,dis2);
			if(d==dis1){
				for(auto v : t){
					if(dis(id,v)==d) s.push_back(v);
				}
				t.clear();
				t.push_back(id);
			} else if(d==dis2){
				for(auto v : s){
					if(dis(id,v)==d) t.push_back(v);
				}
				s.clear();
				s.push_back(id);
			}
		} else {
			//printf("Same Str\n");
			if(dis1==d) t.push_back(id);
			if(dis2==d) s.push_back(id);
		}
		/*
		printf("S[]:");
		for(auto v : s) printf("%lld ",v);
		puts("");
		printf("T[]:");
		for(auto v : t) printf("%lld ",v);
		puts("");
		*/
		printf("%lld\n",s.size()+t.size());
	}
	return 0;
}
2023/9/26 13:33
加载中...