题解
发一个
问题可以看作对于每一个
令
首先,在
此时,
进一步考虑,若
这个东西很好直接用数据结构维护,但由于有些麻烦,且题目中还有未利用的条件,这里继续介绍
对于每一个点
唯一的问题就是
记录一下路径次大值,判断在
#include<bits/stdc++.h>
#define re register
using namespace std;
inline int read(){
re int t=0;re char v=getchar();
while(v<'0')v=getchar();
while(v>='0')t=(t<<3)+(t<<1)+v-48,v=getchar();
return t;
}
int n,head[200002],dfn[200002],c[200002],cnt,siz[200002],a[200002],tim,b[200002],v[200002],fr[200002];
struct edge{int to,next;}e[400002];
inline void add(re int x,re int y){e[++cnt]=(edge){y,head[x]},head[x]=cnt;}
inline void dfs(re int x,re int y){
dfn[x]=++tim,a[x]=a[y],b[x]=b[y],siz[x]=1;
if(x>a[x])b[x]=a[x],a[x]=x,fr[x]=x;
else if(x>b[x])b[x]=x;
if(dfn[b[x]]>dfn[a[x]])++v[fr[x]];
else ++v[a[x]];
for(re int i=head[x];i;i=e[i].next)
if(e[i].to^y)fr[e[i].to]=(a[x]==x?e[i].to:fr[x]),dfs(e[i].to,x),siz[x]+=siz[e[i].to];
}
int main(){
n=read();
for(re int i=1,x,y;i<n;++i)x=read(),y=read(),add(x,y),add(y,x);
dfs(1,1);
for(re int i=2;i<=n;++i)c[dfn[i]]+=v[i],c[dfn[i]+siz[i]]-=v[i];
for(re int i=2;i<=n;++i)c[i]+=c[i-1];
for(re int i=2;i<=n;++i)printf("%d ",c[dfn[i]]);
}