Loading

NOIP模拟赛 #3

A

给定一个 \(\{1,2,\dots, 8\}\) 的子集 \(A\),求由 \(A\) 中的数字组成长度为 \(n\) 的序列 \(a_{1\dots n}\),有多少种方案,满足对于任意一个数 \(x\) 都有 \(\forall 1\le i <j\le n \land a_i = a_j = x, \ j - i \ge x\),答案对 \(10^9+7\) 取模。

\(n\le 100\)

发现状态数不大,远远小于 \(8! = 40320\),可以直接 dp。

B

给定一个长度为 \(n(n = 2^k)\) 的序列,支持五种操作:

  1. 单点加一个数。

  2. 区间和查询。

  3. 给定 \(x\),令 \(b_{i\text{ xor } x} \gets a_i\),用 \(b\) 覆盖原来的 \(a\)

  4. 给定 \(x\),令 \(b_i \gets \sum\limits_{j \text{ and } x = i} a_i\),用 \(b\) 覆盖原来的 \(a\)

  5. 给定 \(x\),令 \(b_i \gets \sum\limits_{j \text{ or } x = i} a_i\),用 \(b\) 覆盖原来的 \(a\)

\(1\le n\le 524288\)

考虑线段树,维护三个标记 \(tag, mov_1, mov_2\) 表示左右儿子交换标记、左子树对位相加到右子树标记、右子树对位相加到左子树标记。

其中 \(mov_1, mov_2\) 不存在一位同时为 \(1\),且顺序为先交换,再对位相加。

对位相加可以直接线段树合并,时间复杂度 \(\mathcal O((n + q)\log n)\)

  • 启示:不加转化地,直接维护需要求解的整一组信息。

C

\(n\) 个鱼缸,每个鱼缸里水的高度为 \(h_{1\dots n}\),鱼缸的高度都是 \(w\)。有 \(m\) 条鱼,位置为 \(p_{1\dots n}\),跳跃能力为 \(s_{1\dots n}\)。鱼 \(i\) 跳出鱼缸 \(j\) 的条件为 \(h_j + s_i > w\),并且只能跳到鱼缸 \(j - 1\)\(j + 1\)。设 \(c_{1\dots n}\) 为最终每个鱼缸中的鱼的数目,求 \(\sum\limits_{i = 1} ^ n \dfrac {c_i (c_i - 1)} 2\) 的最大值。

\(1\le n\le 10^4, \ 1\le m\le 200\)

考虑求出每条鱼可以跳跃到的位置区间 \([l_i, r_i]\),相当于给每个区间定一个点。由于需要求的式子有凸性,那么位置之间一定有优先级。设 \(f_{l, r}\) 表示 \([l, r]\) 之内的区间的答案,枚举 \(l\dots r\) 之中优先级最高的位置 \(k\),转移 \(f_{l, r} = \max\limits_{l\le k\le r} \left\{ f_{l, k - 1} + f_{k + 1, r} + \dfrac {a_{l, r, k} (a_{l, r, k} - 1)} 2 \right\}\),其中 \(a_{l, r, k}\)\([l, r]\) 之内的覆盖位置 \(k\) 的区间个数。离散化后,位置数为 \(\mathcal O(m)\),时间复杂度 \(\mathcal O(m ^ 3)\)

D

给定一张 \(n\) 个点 \(m\) 条边的简单无向图,对于每个 \(k\in [0, m]\) 求只保留 \(k\) 条边,使得这些边可以被划分为若干个环的方案数,答案对 \(10^9 + 7\) 取模。

\(1\le n\le 25, \ 0\le m\le \dfrac {n (n - 1)} 2\)

注意到合法的保留边的方案中,图一定是若干条欧拉回路组成,而若干条欧拉回路组成的图一定是合法的。这样就转化为了将图判定为由若干个存在欧拉回路的连通块组成,转化为判定每个点的度数为偶数。

考虑设 \(a_i\) 为边 \((u_i, v_i)\) 的二进制状态,即 \(a_i = 2^{u_i - 1} + 2^{v_i - 1}\)。相当于从 \(a_{1\dots n}\) 中选择 \(k\) 个数,使得这些数异或和为 \(0\)

先 FWT,求出 \(fwt(x^{a_1}), fwt(x^{a_2}), \dots , fwt(x^{a_n})\)。考虑经典套路,求出 \(fwt(x^{a_1} + x^{a_2} + \dots x^{a_n})\),这样可以得到对于每个位置 \(y\),被贡献 \(1\) 的数的个数以及被贡献 \(-1\) 的数的个数,不妨令 \(c_y\) 为被贡献 \(1\) 的数的个数。

注意到固定一种选 \(k\) 条边的方案,其 FWT 为 \(fwt(b)\),那么答案为 \([x^0] b = \sum\limits_{S} [x^S] fwt(b)\),这告诉我们每个位置都是独立的,我们只需要对所有情况求和即可。

\(c_y\) 只有 \([0, m]\)\(m + 1\) 种取值,相同的 \(c_y\) 是等价的,所以记 \(cnt_i\)\(\sum\limits_y [c_y = i]\)

枚举 \(i\),枚举 \(x,y(0\le x\le i, \ 0\le y\le m - i)\) 表示选择的 \(1\) 的个数的 \(-1\) 的个数,贡献为 \(ans_{x + y} \gets cnt_i\dbinom ix \dbinom {m - i}y (-1) ^y\)

时间复杂度 \(\mathcal O(2^nn + m ^ 3)\)

posted @ 2024-11-01 15:46  Lgx_Q  阅读(24)  评论(0编辑  收藏  举报