【题解】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;
}

浙公网安备 33010602011771号