【题解】CF1009F Dominant Indices

CF1009F】题解

一:【题面】

二:【解法】

dp[u][i]=sum(dp[v][i-1])
长链剖分优化

三:【代码】

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
vector<int> mp[N];
int son[N],len[N];
void Son(int u,int fa){
	len[u]=1;
	for(auto v:mp[u]){
		if(v==fa) continue;
		Son(v,u);
		if(len[v]>len[son[u]]) son[u]=v;
	}
	len[u]+=len[son[u]];
}
int dp[N],pos[N],cnt;
int ans[N];
bool check(int a,int b){
	if(dp[a]>dp[b]) return 1;
	else if(dp[a]==dp[b]&&a<b) return 1;
	return 0;
}
void Dp(int u,int fa){
	pos[u]=++cnt;
	dp[pos[u]]=1;
	ans[u]=pos[u];
	
	if(son[u]){
		Dp(son[u],u);
		if(check(ans[son[u]],ans[u])) ans[u]=ans[son[u]];
	}
	for(auto v:mp[u]){
		if(v==fa||v==son[u]) continue;
		Dp(v,u);
		for(int i=0;i<len[v];i++){
			dp[pos[u]+i+1]+=dp[pos[v]+i];
			if(check(pos[u]+i+1,ans[u])) ans[u]=pos[u]+i+1;
		}
	}
}
int main(){
	int n;cin>>n;
	for(int i=1;i<n;i++){
		int a,b;cin>>a>>b;
		mp[a].push_back(b);
		mp[b].push_back(a);
	}
	Son(1,0);
	Dp(1,0);
	for(int i=1;i<=n;i++) cout<<ans[i]-pos[i]<<"\n";
	return 0;
}
posted @ 2025-12-31 09:53  Ming3398  阅读(0)  评论(0)    收藏  举报