社区讨论

O(n)T3求hack

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

讨论操作

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

当前回复
11 条
当前快照
1 份
快照标识符
@mijw9b25
此快照首次捕获于
2025/11/29 14:12
3 个月前
此快照最后确认于
2025/11/29 23:31
3 个月前
查看原帖
rt,考场上差一点写出来,回来默写删了一句就能过神的hack,但是没有用到m,求大佬hack。
CPP
#include<bits/stdc++.h>
#define ll long long
#define str string
#define rd read()
#define rt write
using namespace std;
inline int read(){
	char c;
	int x=0,f=1;
	c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x*=10;
		x+=c-'0';
		c=getchar();
	}
	return f*x;
}
const int N=8e3+10;
int top[N],sz[N],son[N],fa[N],dpt[N];
vector<int>vc[N];
long long w[N],gx[N];
void dfs1(int u,int f){
	dpt[u]=dpt[f]+1;
	fa[u]=f;
	sz[u]=1;
	for(auto it:vc[u]){
		if(it==f) continue;
		dfs1(it,u);
		sz[u]+=sz[it];
		if(sz[it]>sz[son[u]]) son[u]=it;
	}
} 
void dfs2(int u,int f){
	if(son[f]==u) top[u]=top[f];
	else top[u]=u;
	if(son[u]) dfs2(son[u],u);
	for(auto it:vc[u]){
		if(it==f||it==son[u]) continue;
		dfs2(it,u);
	}
}
void sol(int u,int f){
	if(son[u]){
		sol(son[u],u);
		gx[u]=gx[son[u]];
		w[u]=w[son[u]]+1;
	}else{
		w[u]=0,gx[u]=1;
	}
	for(auto it:vc[u]){
		if(it==f||it==son[u]) continue;
		sol(it,u);
		gx[u]+=gx[it];
		w[u]=max(w[u],w[it]+1);
	}
	if(son[u]) gx[u]+=w[u]+1;
	if(u==son[f]) return;
	if(gx[u]<=1ll*sz[u]*dpt[f]){
		w[f]+=sz[u];
		gx[u]=0;
	}
}
int main(){
	int t=rd;
	while(t--){
		int n=rd,m=rd;
		for(int i=1;i<=n;i++) vc[i].clear();
		memset(son,0,sizeof(son));
		memset(sz,0,sizeof(sz));
		memset(w,0,sizeof(w));
		memset(gx,0,sizeof(gx));
		dpt[1]=0;
		for(int i=2;i<=n;i++){
			int fu=rd;
			vc[i].emplace_back(fu);
			vc[fu].emplace_back(i);
		}
		dfs1(1,1),dfs2(1,1);
		sol(1,1);
		cout<<gx[1]<<'\n';
	}
	return 0;
}

回复

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

正在加载回复...