想 + 写 + 调这题 2h 了,真不知道哪错了,思路基本和第一篇题解一样,可能在扩展链的时候寄了,求助 /kel
/**
* author: sunkuangzheng
* created: 27.10.2023 17:37:28
**/
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5+5;
int t,n,u,v,fa[N][24],dep[N],uu,ans[N],siz[N],l,r;vector<int> g[N];
void dfs(int u,int f){
fa[u][0] = f,dep[u] = dep[f] + 1,siz[u] = 1;
for(int i = 1;i <= 20;i ++) fa[u][i] = fa[fa[u][i-1]][i-1];
for(int v : g[u]) if(v != f) dfs(v,u),siz[u] += siz[v];
}int lca(int u,int v){
if(dep[u] < dep[v]) swap(u,v);
while(dep[u] > dep[v]) u = fa[u][__lg(dep[u] - dep[v])];
for(int i = 20;i >= 1;i --) if(fa[u][i] != fa[v][i]) u = fa[u][i],v = fa[v][i];
return (u == v ? u : fa[u][0]);
}signed main(){
ios::sync_with_stdio(0),cin.tie(0);
cin >> t;
while(t --){
cin >> n,ans[n + 1] = 0;
for(int i = 1;i <= n;i ++) ans[i] = 0;
for(int i = 1;i <= n;i ++) g[i].clear();int nb = 1;
for(int i = 1;i <= n;i ++) for(int j = 0;j <= 22;j ++) fa[i][j] = 0;
for(int i = 1;i < n;i ++) cin >> u >> v,g[++u].push_back(++v),g[v].push_back(u);
dfs(1,0),l = r = 1,ans[1] = 0;int ed = 0;
for(int v : g[1]) ans[1] += siz[v] * nb,nb += siz[v];
cout << n * (n - 1) / 2 - ans[1] << " ";
for(int i = 2;i <= n;i ++){
int l1 = lca(l,i),l2 = lca(r,i);
if(l2 == r) r = i; else if(l1 == l && (lca(l,r) != l || lca(i,r) == l)) l = i;
else if(l1 == i || l2 == i);
else {ans[i] = 0;break;}
if(dep[r] < dep[l]) swap(l,r);
if(l == 1){
if(!ed){for(u = r;fa[u][0] != 1;u = fa[u][0]);ed = u;}
ans[i] = siz[r] * (siz[l] - siz[ed]);
}else ans[i] = siz[l] * siz[r];
}for(int i = 1;i <= n;i ++) cout << ans[i] - ans[i+1] << " ";
cout << "\n";
}
}
说句闲话:开始写这道题的时候它还是紫的 qwq。