暑假集训做题报告

这里只记录了没做出来和做了很久的题。
网上不好找到正常题面的会给出。

P7737 [NOI2021] 庆典

来源:MX前置训练
考察:有向图 \(Tarjan\) ,拓扑排序,虚树

Solution

首先看到“有向图”,“可到达的节点数量”,先缩点。缩点后,每个点有个点权,表示这个点实际包含的节点个数。

接下来考察题目给出的性质,取三个点 \(u\), \(v\), \(x\),讨论其关系:

  1. \(x\) 可以到达 \(u\) 和 \(v\)。这种情况下,题目性质没有体现。
  2. \(u\) 和 \(v\) 都可以到达 \(x\)。这种情况下,\(u\) 和 \(v\) 之间一定存在一条边。

因为转为无向边后图连通,所以上述讨论涵盖所有情况。

那么注意到,我们一定可以建出一棵叶向树。假如我们是随便建出的树。

那么除了树边还有什么边?

设某条非树边是 \((x, y)\), 表示从 \(x\) 到 \(y\)。

  1. \(x\) 是 \(y\) 的祖先。那这条边没有意义,因为 \(x\) 本来就能到 \(y\)。
  2. \(y\) 是 \(x\) 的祖先。不存在这样的边,因为已经缩过点。
  3. \(x\) 和 \(y\) 无祖先-后代关系。

只有第 \(3\) 类边需要处理。经过思考后发现这种边无法直接处理,但是可以把它转化成第 \(1\) 类边。转化的方法就是通过拓扑排序建树,每个点保留最后一条入边作为父边。这样是不会改变连通性的。

接下来考虑怎么处理询问。

当 \(k\) 比较大时,分类讨论就会变得困难。这时考虑将 \(s\), \(t\),还有新边的端点作为关键点,建出虚树。虚树上每个点的点权还是表示这个点实际包含的节点数, \((x, y)\) 的边权表示从 \(x\) 到 \(y\) 的路径上,经过的点的点权之和(不包含 \(x\) 和 \(y\))。新边的边权为 \(0\)。

因为是虚树,点数不超过关键点个数的二倍,所以每组询问得到的虚树规模很小,直接在虚树上暴力求解即可。

总结

没做出来的原因:想到了缩点后建出叶向树,但是没有想到可以通过拓扑排序转化第 \(3\) 类边。

其实对于有向图,\(Tarjan\) 和拓扑排序都是很常见的考察方向。在被卡住的时候应该思考是否可以应用这两种算法。而且,思考一下就能发现第 \(3\) 类边是很难处理的,所以接下来的方向就应该是使树上不存在这样的边,而不是继续想怎么处理它。


P10311 「Cfz Round 2」Weighted Mean

来源:MX Day4
考察:构造

Solution

\(a\) 序列顺序是任意的,所以不妨让其从小到大排序。

从限制 2 入手,分式的形式不容易考虑,所以先变换一下式子。变换方法类比分数规划,将其结果设成未知数 \(x\) 。

\[\frac{\sum_{i = 1}^{n} (a_i \cdot b_i)}{\sum_{i = 1}^{n} b_i} = x \]

\[\sum_{i = 1}^{n} (a_i \cdot b_i) = x\sum_{i = 1}^{n} b_i \]

\[\sum_{i = 1}^{n} (a_i \cdot b_i) - x\sum_{i = 1}^{n} b_i = 0 \]

\[\sum_{i = 1}^{n} (a_i \cdot b_i) - \sum_{i = 1}^{n} (x \cdot b_i) = 0 \]

\[\sum_{i = 1}^{n} [b_i \cdot (a_i - x)] = 0 \]

有一个大概的思路是先确定 \(x\),让 \(a_i - x\) 两两配对消去。中位数似乎是一个不错的选择。因为 \(n\) 为偶数时的中位数不是原序列中的数,所以先考虑 \(n\) 为奇数的情况。

\(n\) 为奇数

考虑三个数 \(x\) , \(mid\) , \(y\) ,满足 \(x \lt mid \lt y\) 。令 \(x\) 对应的 \(b\) 为 \((y - mid)\) , \(y\) 对应的 \(b\) 为 \((mid - x)\) 。发现这样构造可以让中位数左右两边的两两配对并消去,最后是合法的。那么 \(mid\) 的 \(b\) 值怎么办呢?因为这样构造可能出现两个 \(b\) 值相同的情况,所以 \(mid\) 的 \(b\) 值尽量不能与其他 \(b\) 重复。注意到,这样构造出的 \(b\) 满足 \(b \in [1, m - 1]\) ,所以可以让 \(mid\) 对应的 \(b\) 为 \(m\) 。

\(n\) 为偶数

对于偶数的情况,中位数与 \(a_{\lfloor \frac{n}{2} \rfloor}\) 和 \(a_{\lfloor \frac{n}{2} \rfloor + 1}\) 有关。如果 \(a_{\lfloor \frac{n}{2} \rfloor} \lt a_{\lfloor \frac{n}{2} \rfloor + 1} - 1\) ,那么我们可以任取一个它们之间的数作为 \(mid\) ,然后用 \(n\) 为奇数情况下的构造。如果 \(a_{\lfloor \frac{n}{2} \rfloor} = a_{\lfloor \frac{n}{2} \rfloor + 1} - 1\) ,那么刚刚的方法就不完全适用了。这也是这道题目最困难的地方。

假如我们取了 \(a_{\lfloor \frac{n}{2} \rfloor}\) 作为 \(mid\) ,那么右侧会多一个元素,这是会影响我们配对的。考虑将多出来的元素合并。具体的,让 \(a_n\) 加上 \(a_{\lfloor \frac{n}{2} \rfloor + 1}\) ,然后再左右配对,最后令 \(b_{\lfloor \frac{n}{2} \rfloor + 1} = b_n\) 即可。正确性证明就是取一个 \(n\) 较小的情况,设未知数计算。但是需要注意,由于这里 \(b_n\) 复制了一次,所以就不能再有 \(b\) 与它相同,否则违反限制 3 。如果我们找不到一个合适的 \(b_n\) ,那就需要换用 \(a_{\lfloor \frac{n}{2} \rfloor + 1}\) 作为 \(mid\) 。可以证明,这两个 \(mid\) 一定有一个可行。证明也是设未知数,假定它们都不可行,列出方程,发现无解。

总结

对于限制较多的题目,可以先从单个限制入手,也就是主动弱化限制。分式的变换方法也值得注意。


CF1613F Tree Coloring

来源:MX Day5
考察:DP ,容斥,生成函数,NTT

Solution

如果我们直接做,发现并不好设计 DP ,原因很简单:颜色数量多,且状态高度关联。注意到题目要求“不存在...”,这启示我们使用容斥。实际上,这里的容斥,本质上是题目本身的限制覆盖范围太大,是一个点的所有儿子,而把限制反过来后只涉及到其中一个儿子,相当于是加强了限制。主动加强限制是一种常见的手法。

我们设有 \(k\) 组不满足条件的父子,考虑到钦定的 \(k\) 组之外的颜色是任意的,会出现不合法情况,所以有一个容斥系数 \((-1)^k\) 。

接下来就是统计方案,怎么考虑呢?

发现选出 \(k\) 对父子是不容易的,因为一个父亲只能匹配一个儿子。所以先想选出之后的方案。

我们把初始的 \(n\) 个点看成独立的块,选出 \(k\) 对父子就是合并了 \(k\) 次,那么此时块的数量就是 \(n - k\) 。对于每个块,只要定下其中任意一个点的颜色,其他点的颜色就都知道了,因此只关心块与块之间的相对顺序。方案数是 \((n - k)!\) 。

接下来剩下怎么选那 \(k\) 对父子,一个很巧妙的方式是这样的:

我们记录每个点有 \(son_i\) 个儿子,定义多项式 \(F = \prod \limits_{i = 1}^{n} (1 + son_i x)\) 。设 \(f_k\) 表示选出 \(k\) 对不满足条件的父子的方案数。那么 \(f_k = [x^k]F\) 。下面说一下 \(F\) 的构造是什么含义。首先每一项的 \(1\) 表示这个父亲与它所有儿子的配对都是合法的,\(son_i\) 是从它的儿子中选出一个与它匹配。\([x^k]F\) 是由 \(k\) 个 \(son_i\) 累计得到的,并且包含了 \(\binom{n}{k}\) 种情况,也就是所有情况。

好,下面整理一下,式子就是:

\[\sum_{k = 0}^{n} (-1)^k \cdot (n - k)! \cdot f_k \]

\(f\) 可以用分治 \(NTT\) 在 \(\mathcal{O} (n log_2 ^ 2 n)\) 的复杂度求出。不过这不是最优复杂度。

\(son_i\) 具有一个性质,就是 \(\sum_{i = 1}^{n} son_i \lt n\) 。利用这个性质,我们可以进行优化。

我们把 \(son_i\) 按照值分成 \(n - 1\) 类。从第 \(n - 1\) 类向第 \(1\) 类合并,依次相乘。第 \(n - 1\) 类参与了 \(n - 2\) 次合并,第 \(n - 2\) 类参与了 \(n - 3\) 次合并,第 \(n - 3\) 类参与了 \(n - 4\) 次合并,以此类推。记录 \(cnt_i\) 表示第 \(i\) 类有多少个成员。这样合并的总次数就是 \(\sum_{i = 1}^{n - 1} cnt_i \cdot (i - 1)\) 。而 \(\sum_{i = 1}^{n - 1} cnt_i \cdot i = \sum_{i = 1}^{n} son_i\) 。所以这样合并的总次数是 \(\mathcal {O} (n)\) 级别的,复杂度就是 \(\mathcal {O} (n log_2 n)\) 。

总结

这道题理解起来简单,但是值得琢磨的地方其实挺多。

  1. 一道题目如果限制不够强,那么就要主动加强限制。什么算是不够强?拿这道题目来说,原限制包含的关键因素太多了,仅仅依靠原限制是很难把状态表达出来的。但是把它反过来,关键因素就只有其不合法的儿子。虽然这样会忽略掉其他节点的合不合法,但是可以通过容斥解决。通过加强限制,我们重构了问题,使其模型更加清晰,或者说涉及到的因素没有那么多了。
    要达到这一目的,“钦定”是一种常见的方法。比如这道题目钦定了不合法儿子,再比如一些排列类的计数,往往钦定某些段的内部顺序。而容斥本身就是钦定不合法。当然,容斥也是改变问题结构的方法。

  2. 在树上选边,可以看做合并联通块。

  3. 在最后的复杂度优化部分,有一个均摊方法。个数多,但总和固定。

  4. 生成函数和多项式虽然我现在还不会,不过先整理一下。这里问题是

    \[每个位置独立选择,问方案数。 \]

    这类问题可以用生成函数刻画。


P1654 OSU!

来源:MX Day5
考察:DP,期望

Solution

\(3\) 次方不算太大,试着把加一个 \(1\) 的贡献拆开,这显然与前面 \(1\) 的个数相关。设末尾有 \(x\) 个 \(1\) ,那么:

\[(x + 1) ^ 3 = x ^ 3 + 3 x ^ 2 + 3 x + 1 \]

\[(x + 1) ^ 2 = x ^ 2 + 2 x + 1 \]

\[x + 1 = x + 1 \]

也就是说,加一个 \(1\) 的贡献可以通过 \(2\) 次方和 \(1\) 次方辅助计算。
设 \(f[i][j]\)。

  • $f[i][1]: $ 结尾连续 1 长度的期望。
  • $f[i][2]: $ 结尾连续 1 长度2 次方的期望。
  • $f[i][3]: $ 已经产生的分数和当前结尾连续 1 长度3 次方的期望。

转移就是:

\[f[i][1] = p_i \cdot (f[i - 1][1] + 1) + (1 - p_i) \cdot 0 \]

\[f[i][2] = p_i \cdot (f[i - 1][2] + 2f[i - 1][1] + 1) + (1 - p_i) \cdot 0 \]

\[f[i][3] = p_i \cdot (f[i - 1][3] + 3f[i - 1][2] + 3f[i - 1][1] + 1) + (1 - p_i) \cdot f[i - 1][3] \]

总结

当转移涉及高幂次状态时,可以利用低幂次状态辅助转移。

这是在转移层面的优化。


P1758 [NOI2009] 管道取珠

来源:MX Day5
考察:DP

Solution

\(2\) 次方是容易赋予组合意义的。考虑把题目要求的转化为一个有组合意义的问题。

平方可以理解为同一种方案,考虑顺序的情况下自己与自己组合,或者说同时发生的方案数。那么就可以视作有两个同时进行的取珠游戏,要求两个游戏最后结果相同的方案数。

到这里,原题目转化为了一个有组合意义,不涉及 \(2\) 次方的问题。我们改变了问题的结构。

因为最后结果相同,那么过程中每次取出来的珠子也一定相同。据此,我们按照取到第几个珠子来划分阶段.

这样划分,需要知道每个阶段,两个游戏各自上下管道中能取的珠子的颜色,只有这样才能判断取出的珠子颜色是否相同。因为取珠子有固定顺序,所以管道内的珠子数量就可以表达颜色。由于知道当前取到第几个珠子,所以上下管道取出珠子的数量和确定,只用一个管道的珠子数量就可以表示另一个管道的。综上,设 f[\(i\)][\(x_1\)][\(x_2\)],表示取到第 \(i\) 个珠子,游戏 1 的上管道取了 \(x_1\) 个,游戏 2 的上管道取了 \(x_2\) 个的方案数。

转移是简单的。

总结

  1. 高幂次(不能太高)状态可以通过赋予组合意义,转化为低幂次状态。

    这是状态层面的优化。

  2. 当问题结构不好做时,尝试改变结构。


CF1062F Upgrading Cities

来源:MX Day6
考察:拓扑排序

Solution

设 \(cnt_i\) 表示 \(i\) 号点能够到达的,和能够到达 \(i\) 号点的节点个数(不包括自身),题目要求的实际上就是 \(\sum_{i = 1}^{n}[cnt_i \ge n - 2]\) 。

既然是有向图,考察的一般都与连通性有关。 \(Tarjan\) ,拓扑排序, \(bitset\) 统计连通性,这些有向图上的算法都与连通性有关。

题目给出的条件是一般的有向无环图,没有比较特殊的性质,所以一定是上述算法。观察到数据范围有点大, \(bitset\) 统计的话复杂度不对。因为已经无环了,所以 \(Tarjan\) 没有用。那么只能是拓扑排序。

“能被到达”可以通过反图解决,下面只考虑“能到达”。

我们思考拓扑排序的过程。每次我们会从队列中取出一个点 \(x\) ,那么一种想法就是看 \(x\) 和剩下没有出队的点之间的连通关系(这里的没有出队不仅包括在队列里的点,还包括一直没有进队的点)。

我们设 \(siz\) 表示队列中剩下的点的个数。显然, \(x\) 无法到达队列中剩下的点。

  • $siz = 0: $ 此时 \(x\) 可以到达所有尚未出队的点。

  • $siz = 1: $ 设剩下那个点是 \(y\) 。 \(x\) 是无法到达 \(y\) 的。但是只统计这个不够。如果存在一个点 \(u\) , \(y\) 能到达 \(u\) , \(x\) 不能到达 \(u\) ,我们也应该把它考虑进去。那么如果存在这样的 \(u\) ,就说明 \(y\) 能直接到达的点集中,存在一个点是 \(x\) 不能直接到达的。我们可以直接遍历 \(y\) 的出边,判断出边终点的入度是否为 \(1\) 。

  • $siz = 2: $ 此时 \(x\) 一定不满足题目要求。

注意,我们记录的是 \(x\) 能到达的,还没有出队的点的个数。

总结

我会的有向图的算法无非那么几种,把题目中的有向图的特殊性质找全之后,逐个看哪个算法可能有用。

到目前为止,可以看出一个明显的问题。很多时候并不是不会算法,而是根本转化不出可做的结构,或者不会观察性质。


CF1870E Another MEX Problem

来源:MX Day12
考察:贪心

Solution

第一步观察性质。
观察解的形态,对于一个结果值,考虑它是怎么被凑出来的。有若干个子数组的 \(mex\) 值做了若干次 \(xor\) 操作,最后得到一个结果值。那么对于一个固定的结果值,肯定是希望它用到的值集中在较前的位置,这样可以预留更多的操作空间。准确来说,希望 用到的所有子数组元素中最靠后的元素 尽量靠前。设 \(f[i]\) ,表示:在所有结果值是 \(i\) 的方案中,最后面用到的元素最靠前的位置。

第二步转化模型。
这种信息显然是可以互相转移的,思考转移要用哪些信息。首先从 \(f[i]\) 到 \(f[i\) xor \(x]\) 肯定需要知道 \(x\) 。那么就是从 \([f[i], n]\) 中选一个子数组,使得它们的 \(mex\) 为 \(x\) (这里先不考虑从 \([f[i], n]\) 中选多个子数组的情况,因为我们可以逐步转移过去)。这个信息是可以预处理出来的,就是一个后缀,选若干个元素,它们的 \(mex\) 为 \(x\) ,还得是最后用到的元素最靠前。那么完成了单步转移,我们需要考虑转移顺序。发现,\(f[i]\) 之间的转移是有后效性的,不可能递推地转移。这时候再去观察转移图,发现边数并不多,所以考虑用 \(Dijkstra\) 转移。

总结

第一步观察就没做到。


P8179 「EZEC-11」Tyres

来源:MX Day12
考察:贪心,DP

Solution

第一步观察性质。

  1. 对于同一个轮胎,它的使用时间是连续的一段,不然两段合并可以省一次换胎时间。
  2. 对于同一个轮胎,它的代价是单调递增的。

同时观察到,换胎时间是一个重要因素,因为如果没有它,剩下的就是一堆单调递增的序列,可以用个优先队列直接求。如果把换胎时间考虑进来,一个比较暴力的想法就是做个 DP ,但是复杂度不对。

第二步转化模型。
用一个激进一点的方式转化,把换胎时间当成一个轮胎代价的一部分。对于轮胎 \(i\) ,认为它的代价依次是 \(a_i + t\) , \(a_i + b_i(2 - 1)^2\) ,
\(a_i + b_i(3 - 1)^2\) \(...\) 转化后需要把答案减去一个 \(t\) 。那么这一个转化会破坏一个轮胎代价的单调性,但是,注意到因为代价是平方级别的增长,所以在 \(\lceil t \rceil\) 次增长后,必定会超过 \(a_i + t\) 。如果前面 \(\lceil t \rceil\) 个代价的方案确定后,后面还是可以当成单调递增的序列处理。我们对所有轮胎的前 \(\lceil t \rceil\) 个代价做 DP,对于后面的部分做贪心,最后合并答案。

总结

感觉这种转化不太容易想到啊。


CF1592F1 Alice and Recoloring 1

来源:MX Day12
考察:贪心

Solution

第一步观察性质。
观察到,这些操作之间是可以互相表示的,也就是一个操作可以由另一个操作做若干次得到。我们用左上操作表示一下另外三个操作,发现左下和右上的操作没有意义,用左上操作替代它们是不劣的。最终只剩下左上和右下两个操作。

第二步转化模型。
先用左上操作也把右下操作也表示了,之后再换回去,毕竟转化的形式是固定的。一个点要从 \(0\) 变成 \(1\) ,它右下角的矩形内操作点的个数是奇数个。因为每个位置只会做一次左上操作,所以把这些位置标上 \(1\) 。那么这个奇数的条件其实就是异或和为 \(1\) 。那么目标矩形其实就是一个异或和数组,每个点表示其右下矩形的异或和,和二维前缀和的形式相同。通过差分,我们可以得到操作矩形。接下来考虑把一些左上操作换成右下操作来节省次数。如果有 \((i, j)\) , \((i, m)\) , \((n, j)\) , \((n, m)\) 都为 \(1\) ,就可以合并为一个右下操作。因为 \((n, m)\) 是一个位置,所以这种合并只能做一次。

总结

这道题的性质是容易观察的,做法也是容易的。


P4827 [集训队互测 2011] Crash 的文明世界

来源:自己找的
考察:DP,斯特林数

Solution

看到 \(k\) 次方,还要求和。如果直接按照公式枚举 \(n\) 不优,注意到 \(k\) 的范围很小,所以尝试转化为枚举 \(k\) 。那么需要用斯特林数拆一下。

\[\begin{align} S(t) &= \sum_{i = 1}^{n} dist(t, i)^k \\ &= \sum_{i = 1}^{n} \sum_{j = 1}^{k} \binom{dist(t, i)}{j} {k \brace j} j! \\ &=\sum_{j = 1}^{k} {k \brace j} j! \sum_{i = 1}^{n} \binom{dist(t, i)}{j} \end{align} \]

用 DP 处理后面的 \(\sum_{i = 1}^{n} \binom{dist(t, i)}{j}\) ,设 \(f[t][j] = \sum_{i = 1}^{n} \binom{dist(t, i)}{j}\) 。
转移的话是从相邻节点转移,那么 \(dist\) 会加 \(1\) ,因此考虑拆掉组合数:

\[\begin{align} f[t][j] &= \sum_{i = 1}^{n} \binom{dist(t, i)}{j} \\ &= \sum_{i = 1}^{n} \binom{dist(t, i) - 1}{j} + \binom{dist(t, i) - 1}{j - 1} \end{align} \]

用换根 DP 做一下

\[f[t][j] = \sum_{i \in son_t} f[i][j] + f[i][j - 1] \]

总结

拆式子的时候拆成下降幂形式了,然后想直接做 DP,推了一下好像是能转移的,但是比正解要稍微麻烦一点。


P6620 [省选联考 2020 A 卷] 组合数问题

来源:MX Day15
考察:斯特林数,二项式定理

Solution

看到 \(n\) 很大,\(m\) 很小,想到把多项式展开,推一下式子,交换枚举顺序,把有关 \(m\) 的枚举放到前面,后面的再预处理。

\[\begin{align} \sum_{k = 0}^{n}f(k)x^k\binom{n}{k} &= \sum_{k = 0}^{n}\sum_{i = 0}^{m}a_i k^ix^k\binom{n}{k} \\ &= \sum_{i = 0}^{m}a_i\sum_{k = 0}^{n}k^ix^k\binom{n}{k} \\ &= \sum_{i = 0}^{m}a_i\sum_{k = 0}^{n}x^k\binom{n}{k}\sum_{j = 0}^{i}\binom{k}{j}j!{i \brace j} \\ &= \sum_{i = 0}^{m}a_i\sum_{k = 0}^{n}\sum_{j = 0}^{i}\binom{n}{k}\binom{k}{j}j!{i \brace j}x^k \\ &= \sum_{i = 0}^{m}a_i\sum_{j = 0}^{i}\sum_{k = 0}^{n}\binom{n}{k}\binom{k}{j}j!{i \brace j}x^k \\ &= \sum_{i = 0}^{m}a_i\sum_{j = 0}^{i}\sum_{k = j}^{n}\binom{n}{j}\binom{n - j}{k - j}j!{i \brace j}x^k \\ &= \sum_{i = 0}^{m}a_i\sum_{j = 0}^{i}\binom{n}{j}j!{i \brace j}\sum_{k = j}^{n}\binom{n - j}{k - j}x^k \\ &= \sum_{i = 0}^{m}a_i\sum_{j = 0}^{i}\binom{n}{j}j!{i \brace j}\sum_{k = j}^{n}\binom{n - j}{k - j}x^k \\ &= \sum_{i = 0}^{m}a_i\sum_{j = 0}^{i}\binom{n}{j}j!{i \brace j}x^j\sum_{k = j}^{n}\binom{n - j}{k - j}x^{k - j} \\ &= \sum_{i = 0}^{m}a_i\sum_{j = 0}^{i}\binom{n}{j}j!{i \brace j}\sum_{t = 0}^{n - j}\binom{n - j}{t}x^t \\ &= \sum_{i = 0}^{m}a_i\sum_{j = 0}^{i}\binom{n}{j}j!{i \brace j}(x + 1)^{n - j} \\ \end{align} \]

这个形式就可以预处理后面的,然后直接算。

总结

这道题都是很套路的东西:

  1. 交换枚举顺序,枚举范围小的,预处理范围大的。
  2. \(k\) 次方用斯特林数转成下降幂。
  3. 朱世杰恒等式合并两个组合数。
  4. 换元
  5. 二项式定理

P6031 CF1278F Cards 加强版

来源:MX Day15
考察:DP,斯特林数

Solution

首先有个比较显然的式子,先设 \(p = \frac{1}{m}\):

\[\sum_{x = 1}^{n} \binom{n}{x}p^x(1 - p)^{n - x}x^k \]

其实得到这个式子后,可以根据 \(x^k\) 的组合意义,直接得到一个枚举 \(k\) 的式子。但是课上我没听懂,所以就直接推式子推过去了。

发现 \(n\) 的范围大,\(k\) 的范围小。考虑用斯特林数把 \(k\) 次方拆掉,再交换枚举顺序。

\[\begin{align} \sum_{x = 1}^{n} \binom{n}{x}p^x(1 - p)^{n - x}x^k &= \sum_{x = 1}^{n} \binom{n}{x}p^x(1 - p)^{n - x} \sum_{i = 0}^{k}\binom{x}{i} {k \brace i} i! \\ &= \sum_{i = 0}^{k}{k \brace i} i!\sum_{x = 1}^{n} p^x(1 - p)^{n - x} \binom{n}{x}\binom{x}{i} \\ &= \sum_{i = 0}^{k}{k \brace i} i!\sum_{x = i}^{n} p^x(1 - p)^{n - x} \binom{n}{i}\binom{n - i}{x - i} \\ &= \sum_{i = 0}^{k}{k \brace i} i!\binom{n}{i}\sum_{x = i}^{n} p^x(1 - p)^{n - x} \binom{n - i}{x - i} \\ &= \sum_{i = 0}^{k}{k \brace i} i!\binom{n}{i}p^i\sum_{x = i}^{n} p^{x - i}(1 - p)^{n - x}\binom{n - i}{x - i} \\ &= \sum_{i = 0}^{k}{k \brace i} i!\binom{n}{i}p^i\sum_{t = 0}^{n - i} p^{t}(1 - p)^{n - t - i}\binom{n - i}{t} \\ \end{align} \]

后面是很像二项式定理的形式,但是好像拆不下去。下面的化简懒得用公式写了,口胡一下。
用 \(\frac{1}{m}\) 代替掉 \(p\) ,然后把 \(p^t\) 和 \((1 - p) ^ {n - t - i}\) 直接展开,其中 \((1 - p)\) 要表示成 \(\frac{m - 1}{m}\) 的形式,而且要把其中的 \(t\) 次方也拆出来,\(n - i\) 次方先扔出去。然后就发现后面的分子和分母可以消掉一些,变成二项式定理的形式。把后面的通过二项式定理变成一个不用枚举 \(t\) 的式子,再把它和 \((1 - p) ^ {n - i}\) 消掉,最终就成了:

\[\sum_{i = 0}^{k}{k \brace i} i!\binom{n}{i}p^i \]

前面说的通过组合意义得到的也是这个式子。

这里可以上 \(NTT\) ,但是常数大,过不了。

接下来的化简不太一般,不是去拆 \(p^i\) ,而是把 \(k \brace i\) 拆掉。

单项的斯特林数有一种容斥求法:

\[{n \brace m} = \frac{1}{m!} \sum_{i = 0}^{m} (-1)^i \binom{m}{i} (m - i)^n \]

通过组合意义理解,\(n \brace m\) 就是把 \(n\) 个带标号的球,分进 \(m\) 个无标号的桶中,要求桶不为空 的方案数。这个求法就是枚举有多少个桶是空的,然后上容斥。

回到题目,把刚刚式子里的斯特林数这样拆开。

\[\begin{align} \sum_{i = 0}^{k}{k \brace i} i!\binom{n}{i}p^i &= \sum_{i = 0}^{k} \binom{n}{i} p^i \sum_{j = 0}^{i} (-1)^j \binom{i}{j} (i - j)^k \end{align} \]

换元,令 \(j' = i - j\)。

\[\begin{align} \sum_{i = 0}^{k} \binom{n}{i} p^i \sum_{j = 0}^{i} (-1)^{i - j} \binom{i}{j} j^k &= \sum_{j = 0}^{k}j^k\sum_{i = j}^{k}(-1)^{i-j}\binom{n}{i}p^i\binom{i}{j} \\ &= \sum_{j = 0}^{k}j^k\sum_{i = j}^{k}(-1)^{i-j}p^i\binom{n}{j}\binom{n-j}{i-j} \\ &= \sum_{j = 0}^{k}j^kp^j\binom{n}{j}\sum_{i = j}^{k}(-1)^{i-j}p^{i - j}\binom{n-j}{i-j} \\ \end{align} \]

换元,令 \(i' = i - j\)。

\[\begin{align} \sum_{j = 0}^{k}j^kp^j\binom{n}{j}\sum_{i = j}^{k}(-1)^{i-j}p^{i - j}\binom{n-j}{i-j} &= \sum_{j = 0}^{k}j^kp^j\binom{n}{j}\sum_{i = j}^{k}(-p)^i\binom{n-j}{i} \end{align} \]

到这一步就不好化简了,所以设 \(S(j) = \sum_{i = j}^{k}(-p)^i\binom{n-j}{i}\)。考虑递推求 \(S\)。

\[S(j) = S(j + 1) + (-p) * S(j + 1) + (-p)^{k - j}\binom{n - j - 1}{k - j} \]

这样就做完了。

总结

这道题目就是先列出一个朴素式子,进行化简后递推求解。使用了多次换元的技巧,除此以外化简过程就没什么可说的了。后面的递推求 \(S\) 比较有启发性,就是说你可以把一个式子写成类似函数的形式(因为有自变量和因变量),然后用换元或者差分的方法观察它是不是可以递推求。


P3345 [ZJOI2015] 幻想乡战略游戏

来源:MX Day2
考察:点分树

Solution

这个题目主要想说的是点分树的一个维护方式,点分树不一定要把信息全维护在分治中心上,还可以维护在与其点分树上父节点直接相邻的那个点。

拿这道题来说。判断补给站从一个点转移到某个相邻点是否会更优,这件事是简单的。设 \(u\), \(v\) 为点分树上两点,且 \(u\) 为 \(v\) 在点分树上的父亲, \(w\) 在 \(v\) 的分治树内,并且与 \(u\) 直接相邻。

每次通过维护的信息判断从 \(u\) 到 \(w\) 是否会更优,如果更优,就把 \(v\) 分治子树外的所有信息压缩到 \(w\) 上,然后递归处理 \(v\) 分治子树。

总结

点分树的信息不仅可以维护在分治中心,还可以维护在和分治中心相邻的点上。


P14636 [NOIP2025] 清仓甩卖

来源:自己找的
考察:组合计数

Solution

这里按照我的思路过程写的,可能比较冗长。

题目给出了三层比较方法,看起来比较麻烦。\(a\) 序列的顺序不重要,所以按照原价升序,编号降序的方式先排一次序,这样在二三层比较中可以直接知道大小关系。

很自然会去思考不满足条件的情况,但是一开始我没想出来。因此决定去看部分分来找启示。

  • \(1\) ~ \(5\) : 这个是 \(n\) 极小。直接枚举定价,用背包 DP 去 \(check\) 。

  • \(7\) ~ \(9\) : 这个是 \(n\) 小,且 \(m = 2\) 。显然这个部分分使用了最简单的模型,想启示我们思考什么情况下不满足条件。我们只需要思考选两个 \(1\) 或者选一个 \(2\) 的情况。
    设原价为 \(a\), \(b\), \(c\) 的三个物品满足:\(a\) ,\(b\) 定价为 \(1\) ,\(c\) 定价为 \(2\) ;\(a \lt \frac{c}{2} \lt b\) ;\(a + b < c\) 。在这种情况下,我们会去选 \(a\) 和 \(b\) ,但是最优是去选 \(c\) 。这是先选 \(1\) 导致不优的情况。 现在先不去具体分析。
    先选 \(2\) 什么时候不优呢?如果去掉一个定价为 \(2\) 的,去选别的 \(1\) ,那么只能选性价比比它低的(因为性价比如果比它高就已经被选了)。两个小于等于它一半的数加起来不可能比它大。也就是说,先选 \(2\) 不会导致不优。

总结一下,我们只需要考虑 \(a \lt \frac{c}{2} \lt b\) 的情况。

有个 \(case\) 是不存在这样的 \(a\) ,但是存在 \(b\) 和 \(c\) 。不过这比较好处理,在计算时考虑进去即可。

反证得到这里两个小于号是不可以取等的,以及这里的 \(a\) 和 \(b\) 一定是最后选的两个 \(1\) 。

这个式子并不能推到更多结论,所以直接对这样的三元组计数。枚举 \(b\) 和 \(c\) ,因为 \(a\) 带来的贡献是 \(2\) 的次幂形式,可以直接算。为了避免重复计数,这里要钦定 \(c\) 为因为选 \(b\) 导致不能选的,性价比最高的,定价为 \(2\) 的物品。注意:这个限制条件并不意味着不存在性价比在 \([\frac{c}{2}, b]\) 之间且定价为 \(2\) 的物品。

我们要用一些物品(排除 \(b\))消耗完 \(m - 2\) 元,这样选完 \(b\) 就不能选 \(c\) 了。

  • 排名大于 \(c\) 的无论怎么定价都会被买。

  • 排名在 \((b, c)\) 之间只有定价为 \(1\) 时才能被买。

这一部分组合数直接算。

至于 \(a\) ,需要双指针扫出一个前缀范围,方案数是 \(2\) 的次幂。

在数轴上考虑一对 \(b\) ,\(c\) 对不同区间取值的具体限制。

无标题

总结

得出不满足条件的情况并不难,但是计数部分有许多细节。考场上太不清醒,进行了 \(0\) 个分析,甚至没有仔细想过部分分。

posted @ 2026-07-08 16:56  Crimson_Moon  阅读(4)  评论(0)    收藏  举报