0%

The 2025 Shanghai Collegiate Programming Contest - I. 真相(类似于树上背包的转移)

思路讲解

递推公式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
auto dfs=[&](auto&& self,ll u,ll p)->void{
dp[u][0]=1; // 每一个人说真话这种情况一定是存在的
for(auto &v:g[u]){
if(v==p) continue;
self(self,v,u);
vector<ll> tmp(N+5);
ROF(i,sz[u],0){
FOR(j,0,sz[v]){
tmp[i+j]+=dp[u][i]*dp[v][j]%mod;
tmp[i+j]%=mod;
}
}
dp[u]=tmp;
sz[u]+=sz[v];
}
// dp[u][A[u]-1] 就是如果u说真话,dp[u][A[u]]的值
// 因为u说真话,那么情况已经定下来了,其余的就是dp[u][A[u]-1]
dp[u][A[u]]=A[u]?dp[u][A[u]-1]:0; // 对于任何节点来说,A[u]=0都是悖论
};

AC代码

https://codeforces.com/gym/105992/submission/328455295

心路历程(WA,TLE,MLE……)