题解:CF2138C1 Maple and Tree Beauty (Easy Version)
做过的最简单的E。
solution
转化一下题意,可以发现,就是对树的每一层进行染色,要求颜色相同的层数最多。
那么我们显然有
于是我们先进行一遍bfs分层,记录每层结点数
设
转移时要判断
dp转移式:
时间复杂度
C1 code
C2
数据范围
int p=(cnt<=n-k?dp._Find_first():dp._Find_next(cnt-n+k-1));
解释一下,如果
code
#include<bits/stdc++.h>
using namespace std;
const int N=500010;
int dis[N],num[N];
vector<int> a[N];
int main(){
int t;
cin>>t;
while(t--){
int n,k,ans=0,maxx=1,cnt=0,minn=1e9;
bitset<N> dp;
cin>>n>>k;
for(int i=2;i<=n;i++){
int v;
cin>>v;
a[i].push_back(v),a[v].push_back(i);
}
queue<int> q;
q.push(1);
dis[1]=1;
while(!q.empty()){
int u=q.front();
q.pop();
num[dis[u]]++,maxx=max(maxx,dis[u]);
if(a[u].size()==1&&dis[a[u][0]]) minn=min(minn,dis[u]);
for(auto v:a[u]){
if(dis[v]) continue;
dis[v]=dis[u]+1;
q.push(v);
}
}
maxx=min(maxx,minn);
sort(num+1,num+maxx+1);
dp[0]=1;
for(int i=1;i<=maxx;i++){
cnt+=num[i];
dp|=dp<<num[i];
int p=(cnt<=n-k?dp._Find_first():dp._Find_next(cnt-n+k-1));
if(p<=k) ans++;
}
cout<<min(ans,maxx)<<"\n";
for(int i=0;i<=n;i++) dis[i]=num[i]=0,a[i].clear();
}
return 0;
}