AC30个,TLE9个。模拟赛时改假做法h+,卡常0.5h+。
#include<bits/stdc++.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define fi first
#define se second
typedef double db;
#define pb push_back
#define eb emplace_back
#define bcnt __builtin_popcount
#define TS printf("!!!tiaoshi\n")
const int inf=15678;
const int N=10055;
int n,m,a,b,c,sz[N],nsz[N];
vector<int> g[N];
short f[2][N][N],dp[2][N][N];
#define cmx(x,y) x=max(0+x,(y))
void dfs1(int u){
nsz[u]=1;
for(int v:g[u]){
dfs1(v);
nsz[u]+=nsz[v];
}
}
void dfs(int u){
for(int i=0;i<=min(nsz[u],b)+1;i++) f[0][u][i]=f[1][u][i]=-inf;
for(int i=0;i<=min(nsz[u],b)+1;i++) dp[0][u][i]=dp[1][u][i]=-inf;
f[0][u][0]=0,f[1][u][1]=0;
dp[0][u][0]=0,dp[1][u][1]=1;
if(!g[u].size()) f[1][u][1]=1,dp[1][u][1]=0;
sz[u]=1;
for(int v:g[u]){
dfs(v);
sz[u]+=sz[v];
for(int i=min(sz[u],b+1);i>=0;i--){
for(int j=min(sz[v],i);j>=0;j--){
cmx(f[0][u][i],f[0][u][i-j]+max(f[0][v][j],f[1][v][j]));
cmx(f[1][u][i],f[1][u][i-j]+f[0][v][j]);
cmx(dp[0][u][i],dp[0][u][i-j]+max(dp[0][v][j],dp[1][v][j]));
cmx(dp[1][u][i],dp[1][u][i-j]+dp[0][v][j]);
}
}
}
}
void sol(){
scanf("%d%d%d%d",&n,&a,&b,&c);
int fa;
for(int i=2;i<=n;i++){
scanf("%d",&fa);
g[fa].eb(i);
}
if(c&1){
for(int i=1;i<=n;i++) g[i].clear();
puts("No");return;
}c>>=1;
dfs1(1),dfs(1);
bool bj=0;
// printf("sum sz:%d\n",sz[1]);
// printf("f:%d %d\n",f[1][1][b+1],f[0][1][b]);
// printf("dp:%d %d\n",dp[1][1][b+1],dp[0][1][b]);
if(b+1>=c&&f[1][1][b+1]>=b+1-c&&dp[1][1][b+1]>=c) bj=1;
else if(b>=c&&f[0][1][b]>=b-c&&dp[0][1][b]>=c) bj=1;
if(bj) puts("Yes");
else puts("No");
for(int i=1;i<=n;i++) g[i].clear();
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
int T=1;
scanf("%d",&T);
while(T--) sol();
return 0;
}