1 条题解

  • 0
    @ 2025-10-8 16:50:34

    80分超时无启发式:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e5+10;
    vector<int>G[N];
    int n,id,dfn[N],_dfn[N],siz[N],col[N],cnt[N],tot,ans,mx;
    
    void dfs1(int x)
    {
        dfn[x]=++id;_dfn[id]=x;
        siz[x]=1;
        for(int y:G[x])
        {
            dfs1(y);
            siz[x]+=siz[y];
        }
    }
    void add(int x){cnt[col[x]]++;if(cnt[col[x]]==1)tot++;mx=max(mx,cnt[col[x]]);}
    void del(int x){cnt[col[x]]--;if(cnt[col[x]]==0)tot--;}
    void dfs2(int x) 
    {
        for(int y:G[x])dfs2(y);
         
        mx=0;
        for(int i=0;i<siz[x];i++) add(_dfn[dfn[x]+i]);
        ans+=(siz[x]==tot*mx);
         
        for(int i=0;i<siz[x];i++) del(_dfn[dfn[x]+i]);
    }
    int main() 
    {
        scanf("%d",&n);
        for(int i=1,x,y; i<=n; i++) 
        {
            scanf("%d%d",&col[i],&x);
            G[x].push_back(i);
        }
        id=0;dfs1(1);
        tot=ans=0;dfs2(1);
        printf("%d",ans);
        return 0;
    }
    

    标准程序:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e5+10;
    vector<int>G[N];
    int n,id,dfn[N],_dfn[N],siz[N],son[N],col[N],cnt[N],tot,ans,mx;
    
    void dfs1(int x)
    {
        dfn[x]=++id;_dfn[id]=x;
        siz[x]=1;son[x]=0;
        for(int y:G[x])
        {
            dfs1(y);
            siz[x]+=siz[y];
            if(siz[son[x]]<siz[y])son[x]=y;
        } 
    }
    void add(int x){cnt[col[x]]++;if(cnt[col[x]]==1)tot++;mx=max(mx,cnt[col[x]]);}
    void del(int x){cnt[col[x]]--;if(cnt[col[x]]==0)tot--;}
    void dfs2(int x,int fa) 
    {
        for(int y:G[x])if(y!=son[x])dfs2(y,fa);
        if(son[x])dfs2(son[x],x); 
        
        for(int i=0;i<siz[x];i++)
        {
            if(_dfn[dfn[x]+i]==son[x]){i=i+siz[son[x]]-1;continue;}
            add(_dfn[dfn[x]+i]); 
        }
        ans+=(siz[x]==tot*mx);
        
        if(son[fa]!=x){for(int i=0;i<siz[x];i++) del(_dfn[dfn[x]+i]);mx=0,tot=0;}
    }
    int main() 
    {
        scanf("%d",&n);
        for(int i=1,x,y; i<=n; i++) 
        {
            scanf("%d%d",&col[i],&x);
            G[x].push_back(i);
        }
        id=0;dfs1(1);
        memset(cnt,0,sizeof(cnt));
        tot=ans=0;dfs2(1,0);
        printf("%d",ans);
        return 0;
    }
    
    
    • 1

    *【树上启发式合并】子树的不同颜色数目相同[洛谷9233]蓝桥杯 2023 省 A颜色平衡树

    信息

    ID
    404
    时间
    300ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    302
    已通过
    67
    上传者