一道 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;
}