没想到啊……我以为正解是子集求和……
因为看 时, ,那么看 时, 。然后就变成了简短的代码
int n = readint(), m = readint(); for(int i=1,x; i<=n; ++i){ x = (1<<MaxN)-1-readint(); ++ dp[x]; } for(int i=0; i<MaxN; ++i) for(int j=0; j<(1<<MaxN); ++j) if(j>>i&1) dp[j] += dp[j^(1<<i)]; for(int i=1,x; i<=m; ++i){ x = (1<<MaxN)-1-readint(); puts(dp[x] ? "yes" : "no"); }
然而身旁的队长告诉我,既然是判断 或 ,只需要直接大傻叉 (或者用 实现同样的功能)就行了……
再然后,身后的法国人,子集枚举过掉了?又有身后的队霸, 左右子树都递归,还是随便切?
建议出题人反省一下,为什么不求有多少个数包含之,为什么数据极其强悍?
全部评论
(5) 回帖