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)\) 的序列,支持五种操作:
-
单点加一个数。
-
区间和查询。
-
给定 \(x\),令 \(b_{i\text{ xor } x} \gets a_i\),用 \(b\) 覆盖原来的 \(a\)。
-
给定 \(x\),令 \(b_i \gets \sum\limits_{j \text{ and } x = i} a_i\),用 \(b\) 覆盖原来的 \(a\)。
-
给定 \(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)\)。