专栏文章
题解:AT_arc157_e [ARC157E] XXYX Binary Tree
AT_arc157_e题解参与者 4已保存评论 5
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mio8jxdt
- 此快照首次捕获于
- 2025/12/02 15:07 3 个月前
- 此快照最后确认于
- 2025/12/02 15:07 3 个月前
Sol
本题的关键即为
Y 点。不难发现由题中限制,所有
Y 点必然为独立集,且 Y 点的数量是一定的。具体地,若根节点为
Y,则叶子节点 Y 的数量为 ;否则,为 。同时非叶子节点 Y 的数量为 。那么我们可以这么树上 DP,记 表示以 为根子树中, 是或不是
Y,存在 个叶子节点为 Y 和 个非叶子节点为 是否可行。考虑优化,我们记 表示以 为根子树中, 是或不是
Y,存在 个叶子节点为 Y 时最多的非叶子节点为 Y 的个数,显然最后要求非叶子 Y 节点数量不超过最多值即可。复杂度由树上背包可证为 。Code
CPPconst int N=1e4+5;
int n,a,b,c;
vec<int> g[N];
int f[N][2][N>>1];
int sz[N];
inline void dfs(int x=1){
if(g[x].empty()){
sz[x]=1;
f[x][0][0]=0,f[x][1][1]=0;
f[x][0][1]=f[x][1][0]=-inf;
return;
}
sz[x]=0;
f[x][1][0]=1;f[x][0][0]=0;
for(auto y:g[x]){
dfs(y);
rep(i,sz[x]+1,sz[x]+sz[y])f[x][0][i]=f[x][1][i]=-inf;
per(i,sz[x],0)per(j,sz[y],0)chmax(f[x][0][i+j],f[x][0][i]+max(f[y][0][j],f[y][1][j])),chmax(f[x][1][i+j],f[x][1][i]+f[y][0][j]);
sz[x]+=sz[y];
}
}
inline void Main(){
cin>>n>>a>>b>>c;
if(n==1)return put("Yes"),void();
rep(i,1,n)g[i].clear();
rep(i,2,n){
int p;cin>>p;
g[p].pub(i);
}
if(c&1)return put("No"),void();
dfs();
if(sz[1]>=b-c/2&&b>=c/2&&f[1][0][b-c/2]>=c/2||sz[1]>=b+1-c/2&&b+1>=c/2&&f[1][1][b+1-c/2]>=c/2)put("Yes");
else put("No");
}
相关推荐
评论
共 5 条评论,欢迎与作者交流。
正在加载评论...