常数快要被我优化成负的了还是TLE on Test8/kk/kk/kk/kk
最好能来个人证明是我算法假掉了而不是常数问题/kk
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
const int buff_size = 1e6;
char gc() {
static char buf[buff_size], *p1 = buf, *p2 = buf;
return p1 == p2 &&
(p2 = (p1 = buf) + fread(buf, 1, buff_size, stdin), p1 == p2)
? EOF
: *p1++;
};
inline void pc(const char &c = 0) {
static char buf[buff_size], *p = buf;
if (p - buf == buff_size || !c) fwrite(buf, 1, p - buf, stdout), p = buf;
*p++ = c;
}
template <class _Tp = int>
inline void write(_Tp x) {
if (x < 0) x = -x, pc('-');
static int sta[35];
int top = 0;
do {
sta[top++] = x % 10, x /= 10;
} while (x);
while (top) pc(sta[--top] ^ 48);
}
template <class _Tp = int>
inline _Tp read() {
_Tp w = _Tp();
bool f = 0;
char ch = gc();
while (!isdigit(ch)) f |= ch == '-', ch = gc();
while (isdigit(ch)) w = (w << 3) + (w << 1) + (ch ^ 48), ch = gc();
return f ? -w : w;
}
using namespace std;
int n,S,s[100005],ans[100005],res;
vector<int>to[100005];
void dfs(int p,int f,int NEKO){
int mx=0,smx=0;
for(int i=0;i<to[p].size();i++){
int X=to[p][i];
if(X!=f){
dfs(X,p,NEKO);
if(s[X]>mx){
smx=mx;
mx=s[X];
}else if(s[X]>smx)
smx=s[X];
}
}
if(mx+smx+1>=NEKO){
s[p]=0;
res++;
}else s[p]=mx+1;
}
int main(){
n=read();
S=sqrt(n*log2(n));
for(int i=1,u,v;i<n;i++){
u=read();
v=read();
to[u].push_back(v);
to[v].push_back(u);
}
for(int i=1;i<=S&&i<=n;i++){
res=0;
dfs(1,0,i);
ans[i]=res;
}
for(int i=S+1,l,r,mid,R;i<=n;i=R+1){
res=0;
dfs(1,0,i);
ans[i]=res;
l=i;
r=n;
while(l<=r){
mid=(l+r)/2;
res=0;
dfs(1,0,mid);
if(res==ans[i]){
R=mid;
l=mid+1;
}else r=mid-1;
}
for(int j=i+1;j<=R;j++)
ans[j]=ans[i];
}
for(int i=1;i<=n;i++){
write(ans[i]);
pc('\n');
}
pc();
}