/**
* author: sunkuangzheng
* created: 16.10.2023 15:18:08
**/
#include<bits/stdc++.h>
using namespace std;
const int N = 3e5+5;
int t,n,u,v,T,dep[N],rt,sb,mk[N],dp[N];vector<int> g[N];
inline void dfs(int u,int fa,int &rt){
if(u) dep[u] = dep[fa] + 1;if(dep[u] > dep[rt] && mk[u]) rt = u;
for(int v : g[u]) if(v != fa) dfs(v,u,rt);
}inline bool ck(int ans,int le){
int fg = 0;
for(int i = 1;i <= n;i ++) mk[i] = (dp[i] > ans),fg |= mk[i];
if(!fg) return 1;
rt = 0,dfs(1,0,rt),sb = 0,dfs(rt,0,sb);
return ((dep[sb] + 1) / 2 + le <= ans);
}int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin >> T;
while(T --){
cin >> n,dep[0] = -1;
for(int i = 1;i <= n;i ++) g[i].clear();
for(int i = 1;i < n;i ++) cin >> u >> v,g[u].push_back(v),g[v].push_back(u);
dfs(1,0,rt);
for(int i = 1;i <= n;i ++) dp[i] = dep[i];
for(int i = 1;i <= n;i ++){
int l = 1,r = n;
while(l <= r){
int mid = (l + r) / 2;
if(ck(mid,i)) r = mid - 1; else l = mid + 1;
}cout << r + 1 << " ";
}cout << "\n";
}
}
感觉 ck 函数会被调用 O(nlogn) 次,ck 函数的时间复杂度是 O(n),所以应该是 O(n2logn) 的。
但是不知道为什么 n=3000 时就 T 飞了 /kk