萌新 WA #13 求助
  • 板块CF1481F AB Tree
  • 楼主shinzanmonoszm 妹妹
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/8/30 21:21
  • 上次更新2023/11/3 00:16:39
查看原帖
萌新 WA #13 求助
610557
shinzanmonoszm 妹妹楼主2023/8/30 21:21
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
const int sz=1e5+10;
const int sqsz=500;
std::vector<int>graph[sz],node[sz];
int dep[sz],maxd,belong[sz],deg[sz];
void dfs(int u,int fau){
    dep[u]=dep[fau]+1;
    maxd=std::max(maxd,dep[u]);
    node[dep[u]].push_back(u);
    for(int v:graph[u]){
        if(v==fau)continue;
        dfs(v,u);
    }
}
int f[sqsz][sz],cnt[sz],val[sz],size[sz];
char ans[sz];
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int n,suma,sumb;
    std::cin>>n>>suma,sumb=n-suma;
    for(int i=2,f;i<=n;i++)
        std::cin>>f,graph[f].push_back(i),deg[f]++,deg[i]++;
    dfs(1,0);
    for(int i=1;i<=maxd;i++)
        size[i]=val[i]=node[i].size();
    std::sort(val+1,val+maxd+1);
    int l=std::unique(val+1,val+maxd+1)-val-1;
    for(int i=1;i<=maxd;i++){
        size[i]=std::lower_bound(val+1,val+l+1,size[i])-val;
        cnt[size[i]]++,belong[i]=size[i];
    }
    std::fill(f[1]+1,f[1]+suma+1,-1);
    for(int i=1;i<=cnt[1];i++)f[1][i*val[1]]=0;
    for(int i=2;i<=l;i++){
        for(int j=1;j<=n;j++){
            if(f[i-1][j]!=-1)f[i][j]=j;
            else if(j>=val[i]&&f[i][j-val[i]]!=-1&&(j-f[i][j-val[i]])/val[i]<=cnt[i])f[i][j]=f[i][j-val[i]];
            else f[i][j]=-1;
        }
    }
    if(f[l][suma]!=-1){
        std::cout<<maxd<<"\n";
        int use[sz],cur=suma;
        for(int i=l;i>=1;i--){
            use[i]=(cur-f[i][cur])/val[i];
            cur=f[i][cur];
        }
        for(int i=1;i<=maxd;i++){
            if(use[belong[i]]!=0){
                use[belong[i]]--;
                for(int u:node[i])ans[u]='a';
            }else for(int u:node[i])ans[u]='b';
        }
    }else{
        std::cout<<maxd+1<<"\n";
        char a='a',b='b';
        for(int i=1;i<=maxd;i++){
            std::sort(node[i].begin(),node[i].end(),[](int x,int y)->bool {
                if(deg[x]!=deg[y])return deg[x]<deg[y];
                return dep[x]<dep[y];
            });
            if(suma<sumb)std::swap(suma,sumb),std::swap(a,b);
            for(int u:node[i]){
                if(suma!=0)suma--,ans[u]=a;
                else sumb--,ans[u]=b;
            }
        }
    }
    for(int i=1;i<=n;i++)std::cout<<ans[i];
    return 0;
}
2023/8/30 21:21
加载中...