社区讨论

我这个贪心假在哪了(必关)

P14637[NOIP2025] 树的价值参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mjlebo8y
此快照首次捕获于
2025/12/25 20:05
2 个月前
此快照最后确认于
2025/12/27 17:15
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
//因为爱,所以坚持
using namespace std;

int T,n,m,p[8050],ans[8050],sum,d[8050];
vector<int> es[8050];

bool ok(int x){
	for(int i = 0;i < es[x].size();++i){
		int v = es[x][i];
		if(es[v].size() != 0) return false;
	}
	return true;
}
void del(int x){
	ans[x] = 0;
	for(int i = 0;i < es[x].size();++i) del(es[x][i]);
}
inline int calc(int x){
	int res = ans[x];
	for(int i = 0;i < es[x].size();++i){
		res+=calc(es[x][i]);
	}
	return res;
}
void dfs(int u,int fa){
	d[u] = d[fa]+1;
	if(es[u].size() == 0) return ;
	if(ok(u)){
		ans[u] = es[u].size()+1;
		ans[es[u][0]] = 1;
		return ;
	}
	int mx = 0;
	for(int i = 0;i < es[u].size();++i){
		int v = es[u][i];
		dfs(v,u);
		if(es[v].size() == 0) ans[v] = 1;
		mx = max(mx,ans[v]);
	}
	bool flag = false;
	for(int i = 0;i < es[u].size();++i){
		int v = es[u][i];
		if(ans[v] == mx && flag == false){
			ans[u] += ans[v]+1;
			flag = true;
			continue;
		}
		if(d[u]*ans[v] <= calc(v)) continue;
		ans[u]+=ans[v];
		del(v);
	}
	if(ans[u] == 0) ans[u] = mx+1;
}

int main(){
	freopen("data.in","r",stdin);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>T;
	while(T--){
		for(int i = 1;i <= n;++i){
			es[i].clear();
			ans[i] = sum = 0;
		}
		cin>>n>>m;
		for(register int i = 2;i <= n;++i){
			cin>>p[i];
			es[p[i]].push_back(i);
		}
		dfs(1,0);
		for(int i = 1;i <= n;++i) sum+=ans[i];
		cout<<sum<<endl;
	}
	return 0;
}
错误数据:
CPP
1
18 17
1 2 2 4 4 3 3 3 3 10 5 7 7 9 8 10 5

回复

0 条回复,欢迎继续交流。

正在加载回复...