?
№ | Отправитель | Задача | Язык | Вердикт | Время | Память | Отослано | Протест. | |
---|---|---|---|---|---|---|---|---|---|
230637829 |
Дорешивание: racccccoon |
1527D - 74 | C++14 (GCC 6-32) | Полное решение | 171 мс | 79056 КБ | 2023-10-31 10:35:50 | 2023-10-31 10:35:50 |
// LUOGU_RID: 132594012 #include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=5e5+10; struct edge {int to,nxt;}; edge e[N*2];int head[N],tot; void add(int u,int v) { e[++tot]={v,head[u]};head[u]=tot; } int n,fa[N],dep[N],sz[N]; int dfn[N],dc,st[N][25]; LL sum[N],f[N];int L,R; void dfs0(int u,int pa) { dfn[u]=++dc;st[dc][0]=pa; fa[u]=pa;dep[u]=dep[pa]+1;sz[u]=1; for(int i=head[u];i;i=e[i].nxt) { int v=e[i].to;if(v==pa)continue; dfs0(v,u); sum[u]+=1ll*(sz[u]-1)*sz[v]; sz[u]+=sz[v]; } } int get(int u,int v) { return (dfn[u]<dfn[v])?u:v; } void init() { for(int i=1;i<=__lg(n);i++) { for(int j=1;j+(1<<i)-1<=n;j++) { st[j][i]=get(st[j][i-1],st[j+(1<<(i-1))][i-1]); } } } int LCA(int u,int v) { if(u==v)return u; if( (u=dfn[u]) > (v=dfn[v]) )swap(u,v); int d=__lg(v-u); return get(st[u+1][d],st[v-(1<<d)+1][d]); } bool flag=1; void work() { scanf("%d",&n); for(int i=1;i<n;i++) { int u,v; scanf("%d%d",&u,&v); add(u,v);add(v,u); } dfs0(0,0); init(); L=R=0; LL all=0; for(int i=0;i<n;i++) all += sum[i]+sz[i]-1; f[0]=sum[0]+sz[0]-1; int it=0; for(int i=1;i<n;i++) { int cal=LCA(i,L),car=LCA(i,R); if(cal==L&&car==R) { int tmp=0; if(!it) for(int j=head[L];j;j=e[j].nxt) { int v=e[j].to; if (dep[v]>dep[L]&&LCA(v,i)==v) { it=v;break; } } tmp= (sz[0]-sz[L]+sz[L]-sz[it]); f[i] = 1ll * tmp * sz[i]; R=i; } else { if(cal==L&&car==0) { f[i] = 1ll * sz[R] * sz[i]; L=i; } else if(car==R&&cal==0) { f[i] = 1ll * sz[L] * sz[i]; R=i; } else if(cal==i||car==i) { f[i]=f[i-1]; } else { break; } } } printf("%lld ",all-f[0]); for(int i=1;i<=n;i++) { printf("%lld ",f[i-1]-f[i]); }puts(""); } void clear() { for(int i=0;i<n;i++) dep[i]=sz[i]=fa[i]=head[i] =sum[i]=f[i]=0; L=R=0;dc=0;tot=0; } signed main() { int T;scanf("%d",&T); while(T--) { work(),clear(); } return 0; }
?
?
?
?