摘要:
题意:给定一棵有 \(n\) 个点(\(n \le 1000\))的树,每条边 \((u, v)\) 有参数 \(c\) 表明 \(u\) 和 \(v\) 谁必须排在前面,求满足所有边条件的排列种数。思路:采用容斥原理解决。先以 \(1\) 为根,将所有 \(c = 1\) 的边看作无限制,求方案数,再通过容斥调整。可在树形DP中带上容斥系数,朴素DP设 \(f_{u,p,s}\) 复杂度超了,将 \(s\) 改为 \(0/1\) 表示其奇偶性。也可利用外向树拓扑序计数公式 \(\frac{n!}{\prod_{i = 1}^n siz_i!}\) 来解决,设 \(f_{u,s}\) 表示满足 \(u\) 的连通块大小为 \(s\) 且在转移时带上容斥系数,整棵子树的方案数,时间复杂度为树形背包的 \(O(n^2)\)。 阅读全文
posted @ 2025-09-16 16:29
wing_heart
阅读(13)
评论(0)
推荐(0)
摘要:
题意:给定 $n$ 个数($n \le 200$,$a_i \le 5 \times 10^4$),求所有满足至少有 $k$ 个子集 $S$ 使得 $\sum_{i \in S} a_i = w$ 的 $w$ 的异或和,$k \le 7$,时限 $0.5s$。思路:朴素背包 DP 复杂度为 $O(n \sum a_i)$,考虑到 $k$ 较小且 $\sum a_i = 10^7$,利用 bitset 优化。原本背包中 $f_i$ 表示和为 $i$ 的方案数,加一个数 $a$ 时 $f'_{i+a} \gets f_{i}$,这里使用 bitset 做位移和按位或操作。对于 $k>1$ 的情况,定义 $f_{k,i}$ 表示考虑到当前数字时,和为 $i$ 的方案数是否达到 $k$,通过 $f_k \gets f_k \mid (f_{k - 1} \ll a)$ 递推,时间复杂度为 $O(k \frac{n \sum a_i}{w})$,能满足时限要求。 阅读全文
posted @ 2025-09-16 09:10
wing_heart
阅读(24)
评论(0)
推荐(0)

浙公网安备 33010602011771号