1 条题解

  • 0
    @ 2025-11-11 16:29:30

    E88 换根DP CF708C Centroids

    // 换根DP O(n)
    #include<bits/stdc++.h>
    using namespace std;
    
    int read(){
      int x=0,s=1;char c=getchar();
      while(c<'0'||c>'9')s=(c=='-')?-1:1,c=getchar();
      while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
      return x*s;
    }
    const int N=400005;
    vector <int> e[N];
    
    int n,sz[N],mx[N],mx2[N],f[N],g[N],ans[N];
    
    void dfs(int u,int fa){
      sz[u]=1;
      for(int v:e[u]){
        if(v==fa) continue;
        dfs(v,u);
        sz[u]+=sz[v];
        if(sz[mx[u]]<sz[v]) mx2[u]=mx[u],mx[u]=v;
        else if(sz[mx2[u]]<sz[v]) mx2[u]=v;
        f[u]=max(f[u],f[v]);
      }
      if(sz[u]<=n/2) f[u]=sz[u];
    }
    void dfs2(int u,int fa){
      for(int v:e[u]){
        if(v==fa) continue;
        if(n-sz[v]<=n/2) g[v]=n-sz[v];
        else if(v!=mx[u])g[v]=max(g[u],f[mx[u]]);
        else g[v]=max(g[u],f[mx2[u]]);
        dfs2(v,u);
      }
      if(sz[u]>n/2) ans[u]=(sz[mx[u]]-f[mx[u]]<=n/2);
      else ans[u]=(n-sz[u]-g[u]<=n/2);
    }
    signed main(){
      n=read();
      for(int i=1,u,v;i<n;i++){
        u=read(),v=read();
        e[u].push_back(v);
        e[v].push_back(u);
      }
      dfs(1,0);
      dfs2(1,0);
      for(int i=1;i<=n;i++) printf("%d ",ans[i]);
      return 0;
    }
    
    
    • 1

    信息

    ID
    1408
    时间
    4000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    13
    已通过
    11
    上传者