Основное
 
 
Отправитель Задача Язык Вердикт Время Память Отослано Протест.  
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;
}
?
Время: ? ms, память: ? КБ
Вердикт: ?
Ввод
?
Вывод участника
?
Ответ жюри
?
Комментарий чекера
?
Диагностика
?
Показать детали тестирования