神秘做题记录5

P4099 [HEOI2013] SAO

发现是树上的 AT_dp_t,考虑树形dp,设 \(dp_{i,j}\) 为以 \(i\) 为根的子树内满足条件且 \(i\) 在第 \(j\) 个的排列个数。

转移依旧是经典树背包形式,三层循环卷积 \(n^2\),只不过这个就不是卷积了。

设 \(sum_{i,j}\) 为所有 \(dp_{i,k},k \le j\) 的和,其实 \(n^3\) 也能做但是加一个前缀和好理解。

转移很简单,是这样的:

  • \(dp_{u,i + j} = dp_{u , i} \times (sum_{h , sz[h]} - sum_{h , j}) \times C_{i + j - 1}^{j} \times C_{sz[u] + sz[v] - i - j}^{sz[u] - i}(u < v)\)
  • \(dp_{u,i + j} = dp_{u , i} \times sum_{h , j} \times C_{i + j - 1}^{j} \times C_{sz[u] + sz[v] - i - j}^{sz[u] - i}(u > v)\)

简单解释一下,\(j\) 就是钦定 \(j\) 个 \(v\) 子树里的点排在 \(u\) 前面,第一种情况 \(v\) 不准在这 \(j\) 个里,第二种情况 \(v\) 必须在这 \(j\) 个里。

然后就是那两个组合数,显然就是除了 \(u\) 和 \(v\) 其他随便了,而 \(u\) 和 \(v\) 我们已经钦定好,所以就是 \(u\) 的左边和右边随便排。

初始状态 \(dp_{u,1} = 1\),细节上就是和树背包完全一致这里不多赘述,处理组合数可以用递推,少写点代码常数也小。

顺带一提,这个还有削弱版,P3757,送通过数的来了。

P10218 [省选联考 2024] 魔法手杖

发现是 xor min 问题,直接上 Trie 树,先考虑二分答案,已知 \(val\),怎么做。

在树上递归决策 \(x\),假设 \(val\) 这一位是 \(1\) ,\(x\) 这一位选 \(1\) ,那么 \(0\) 那一侧显然要往下递归,\(1\) 的一侧要加入 \(S\)。

至于可行性,就要看另一侧的 \(min(a_i) + x\) 是否大于等于 \(val\),\(x\) 肯定是先取着最大可能值,因为只要有可能,我们就要向下看。

但是可能往下决策的过程中这个条件不满足了,这个时候记录 \(mna\) 然后判 \(mna + x \ge val\) 就行。

另一侧的 \(b_i\) 花费直接记 \(sumb\),这样一来有用的信息都维护完了。

考虑时间复杂度,二分 \(k\),check \(nk\),总复杂度 \(nk^2\),因为递归常数巨大无比还要int128所以绝对过不了。

发现check是可行性问题,可行性的东西基本就两个优化思路,第一个是上bitset但是这不是dp所以用不了,然后就是可行转最优化了。

换成贪心,递归中先设 \(val\) 的这一位为 \(1\),看看行不行,行的话就取,否则置为 \(0\),是 \(0\) 当然简单了啥限制都没有。

降蓝吧。

posted @ 2026-10-26 20:05  wzc6666  阅读(4)  评论(0)    收藏  举报