社区讨论

40分左右代码求问能否优化

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

讨论操作

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

当前回复
13 条
当前快照
1 份
快照标识符
@mik3d69v
此快照首次捕获于
2025/11/29 17:31
3 个月前
此快照最后确认于
2025/11/30 16:25
3 个月前
查看原帖
fu,j,kf_{u,j,k} 表示 uu 子树内 mex 为 jj 预留 kk 个节点值大于 mex 用于后续增加 mex 。
CPP
#include<bits/stdc++.h>
namespace yycio{
inline int read(){
	char c=getchar();
	int x=0,f=1;
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while('0'<=c&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
	return x*f;
}
inline void print(int x){
	if(x==0){putchar('0');return;}
	if(x<0)putchar('-'),x=-x;
	char num[40];
	int len=0;
	while(x)num[len++]='0'+(x%10),x/=10;
	while(len--)putchar(num[len]);
}
};
using namespace yycio;
using namespace std;
const int N=8e3+5;

struct edge{
	int v,nxt;
}e[N];
int hd[N],cnt;
inline void add(const int& u,const int& v){e[cnt]={v,hd[u]},hd[u]=cnt++;}

int siz[N];
int f[125][125][125],tmp[125][125];

void dfs(int u){
	siz[u]=1;
	f[u][0][1]=f[u][1][0]=0;
	for(int i=hd[u],v;~i;i=e[i].nxt){
		dfs(v=e[i].v);
		memset(tmp,-1,125*125*sizeof(int));
		for(int j=0;j<=siz[u]+1;j++)
		for(int x=0;x<=siz[v]+1;x++){
			int a=max(j,x);
			for(int k=0;j-1+k<=siz[u];k++)if(~f[u][j][k])
			for(int y=0;x-1+y<=siz[v];y++)if(~f[v][x][y])
			for(int t=a;t<=a+k+y;t++)tmp[t][k+y-t+a]=max(tmp[t][k+y-t+a],f[u][j][k]+f[v][x][y]);
		}
		siz[u]+=siz[v];
		for(int j=0;j<=siz[u]+1;j++)
			for(int k=0;j-1+k<=siz[u];k++)
				f[u][j][k]=max(f[u][j][k],tmp[j][k]);
	}
	for(int j=0;j<=siz[u]+1;j++)
		for(int k=0;j-1+k<=siz[u];k++)
		if(~f[u][j][k])f[u][j][k]+=j;
}

inline void solve(){
	int n=read(),m=read();
	memset(hd+1,-1,n*sizeof(int));
	for(int i=2;i<=n;i++)add(read(),i);
	memset(f,-1,125*125*125*sizeof(int));
	dfs(1);
	int ans=0;
	for(int j=0;j<=n+1;j++)
		if(~f[1][j][0])ans=max(ans,f[1][j][0]);
	print(ans),putchar('\n');
}

signed main(){
	freopen("tree.in","r",stdin);
	freopen("tree.out","w",stdout);
	int t=read();
	while(t--)solve();
	return 0;
}

回复

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

正在加载回复...