社区讨论
40分左右代码求问能否优化
P14637[NOIP2025] 树的价值参与者 6已保存回复 13
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 13 条
- 当前快照
- 1 份
- 快照标识符
- @mik3d69v
- 此快照首次捕获于
- 2025/11/29 17:31 3 个月前
- 此快照最后确认于
- 2025/11/30 16:25 3 个月前
表示 子树内 mex 为 预留 个节点值大于 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 条回复,欢迎继续交流。
正在加载回复...