【时间复杂度】
  • 板块灌水区
  • 楼主Rolen
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/10/16 11:54
  • 上次更新2024/10/16 16:15:30
查看原帖
【时间复杂度】
730113
Rolen楼主2024/10/16 11:54
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
ll n,p,ans,sz[200005],f[200005],mp[200005];
vector<ll>e[200005];
void dfs(ll u){
	sz[u]=1;
	if(!e[u].size()) return;
	ll mx=0;
	for(int i=0;i<e[u].size();i++) dfs(e[u][i]),sz[u]+=sz[e[u][i]],mx=max(mx,sz[e[u][i]]);
	if(mx*2>sz[u]) { ans+=(mx*(sz[u]-mx-1)); return; }
	for(int i=0;i<e[u].size();i++) mp[sz[e[u][i]]]++;
	f[0]=u;
	for(int i=0;i<e[u].size();i++){
		if(!mp[sz[e[u][i]]]) continue;
		for(int j=0;j<sz[e[u][i]];j++){
			for(int l=0,k=-114514191;l*sz[e[u][i]]+j<sz[u];l++){
				if(f[l*sz[e[u][i]]+j]==u) k=l;
				else if(l-k<=mp[sz[e[u][i]]]) f[l*sz[e[u][i]]+j]=u;
			}
		}
		mp[sz[e[u][i]]]=0;
	}
	for(int i=(sz[u]-1)/2;;i--){
		if(f[i]==u){
			ans+=i*(sz[u]-1-i);
			return;
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<n;i++) cin>>p,e[p].push_back(i+1);
	dfs(1),cout<<ans;
}

求问以上代码的时间复杂度

2024/10/16 11:54
加载中...