本来应该是 ACC 2
我打析合树?真的假的?要上吗?
A
把异或值二进制分解,根据期望线性性,\(E((\sum\limits_{i=0}^ka_ix^i)^2)=E(\sum\limits_{i=0}^k\sum\limits_{j=0}^ka_ia_jx^{i+j})=\sum\limits_{i=0}^k\sum\limits_{j=0}^kE(a_ia_j)x^{i+j}\),
而 \(E(a_ia_j)\) 就是选出的子集的异或值的 \(i,j\) 位都为 1 的概率,直接 DP 即可。
B
只需要对每个 \(k\) 算,每个 1 段长度都不超过 \(k\) 的序列个数。
考虑容斥,设 \(f(i)\) 表示在序列中钦定 \(i\) 个长度超过 \(k\) 的 1 段的方案数,则答案为 \(\sum\limits_{i\ge 0}(-1)^if(i)\)。
考虑算 \(f(i)\)。首先在 \(n-m+1\) 个 1 段中选出 \(i\) 个 1 段的方案数为 \({n-m+1\choose i}\),
选出 \(i\) 个 1 段后,既然要钦定这 \(i\) 个 1 段长度超过 \(k\),那就先往它们每一段中插 \(k+1\) 个 1,剩下的 1 随便放,
方案数实际上就是把 \(m-i(k+1)\) 个 1 放进 \(n-m+1\) 个 1 段的方案数,插板法可得方案数为 \({n-i(k+1)\choose n-m}\),
于是 \(f(i)={n-m+1\choose i}{n-i(k+1)\choose n-m}\)。发现 \(i\le m/(k+1)\) 时 \(f(i)\) 才有值,所以复杂度调和级数。
C
观察到两个性质:
- 相邻两个相同的手势可以只留下一个
- 两个强手势夹一个弱手势,可以只留一个强手势
维护一个手势栈,满足以栈顶为第一个时,对于相邻的两个手势,后一个能赢前一个。
考虑加入一个手势 \(x\),若栈顶能赢 \(x\) 直接入栈,若栈顶与 \(x\) 相同由性质 1 直接不管,若 \(x\) 能赢栈顶由性质 2 直接弹栈。
(特别地,若栈中只有一个手势,\(x\) 能赢栈顶,则性质 2 不成立,需要先弹栈再把 \(x\) 入栈)
手模一下,可以发现答案就是栈底,也就是最后一次栈中只有一个手势时的这个手势,考虑如何找到这个时刻。
考虑直接不管栈中只有一个手势的情况,\(x\) 能赢上一个数时必定弹栈(这样栈的大小可能是负的),
画个图可以发现,此时栈的大小最小的时刻,就是我们要找的时刻。
设 \(a_i\) 表示加入 \(i\) 处手势后栈的大小的变化量,则询问 \(l,r\) 时,\(i\) 时刻栈的大小为 \(\sum\limits_{j=l}^ia_j\),
要找栈的大小最小的时刻,就是要找 \(a\) 在 \([l,r]\) 上的前缀和最小值,还需要单点修改,线段树维护即可。
D
看懂这篇题解不需要提前学会析合树和拉格朗日插值。
考虑魔改析合树。
把连续段的定义改成题面中的定义:\([l,r]\) 是连续段当且仅当区间 \([l,r]\) 内的数形成 \([l,r]\) 的排列,
本原段的定义不变:一个连续段是本原段当且仅当没有其他连续段与其部分相交。
那么本原段之间只有包含关系,可以以本原段为点集建出一棵树,这棵树就是析合树。
注意本题中叶子不一定是连续段,但是为了方便不妨把 \(a_i\ne i\) 的叶子也加入树中,称它们为非法叶子。
合点和析点的定义不变:
- 一个点是合点当且仅当任取其连续的若干个儿子,都可以组成连续段。
- 一个点是析点当且仅当任取其连续的若干个儿子,都不能组成连续段。
- \(a_i=i\) 的叶子是析点。
反证法可证一个点要么是合点,要么是析点,要么是非法叶子。称一个点是合法点当且仅当它是合点或析点。
考虑本题中合点,析点下方可以连接什么儿子。
合点的儿子一定是析点,否则若合点 \(u\) 有合点儿子 \(v\),那 \(v\) 的孩子就可以与 \(u\) 的孩子形成连续段与 \(v\) 部分相交,\(v\) 就不是本原段。
析点的儿子类型没有要求,但它们中第一个合法点之前、相邻两个合法点之间、最后一个合法点之后都至少有一个非法叶子,
否则就可以形成新的本原段。
在 DP 之前,还有一个支线问题:确定了某析点的儿子中的合法点后,还需要填入 \(k\) 个非法叶子,有多少种方案?
设方案数为 \(h_k\),可以发现 \(h_k\) 就是长度为 \(k\) 且只有 \([1,k]\) 是连续段的排列个数。(就是 Subtask 2 的 答案)
考虑递推 \(h_k\)。首先反证法可证加入 \(k\) 前排列是个析点,且儿子中只有不超过 1 个合法点。考虑加入 \(k\) 前排列的状态:
-
加入 \(k\) 前只有 \([1,k-1]\) 是连续段(儿子中没有合法点):对于加入 \(k\) 前排列的每一位 \(a_i\),都可以令 \(a_k\gets a_i,a_i\gets k\) 来加入 \(k\)(相当于在置换环的一条边上加了一个点),则对于每种排列有 \(k-1\) 种加入 \(k\) 的方法,方案数 \((k-1)h_{k-1}\)。
-
加入 \(k\) 前不只 \([1,k-1]\) 是连续段(儿子中有一个合法点):设这个合法点的长度为 \(s\)。根据上文,这个合法点最靠左可以取到 \([2,s+1]\),最靠右可以取到 \([k-s-1,k-2]\),有 \(k-s-2\) 种取法,要求加入 \(k\) 后合法点内没有连续段,即要求加入 \(k\) 后合法点内每个加入 \(k\) 前的连续段都过 \(k\),实际上就是要求长度为 \(s+1\) 且每个连续段都过最大值的排列个数,在逆排列上考虑,发现就是要求长度为 \(s+1\) 且只有 \([1,s+1]\) 是连续段的排列个数,即 \(h_{s+1}\),剩下 \(k-s-1\) 个非法叶子有 \(h_{k-s-1}\) 种填法,所以合法点的长度为 \(s\) 时有 \((k-s-2)h_{s+1}h_{k-s-1}\) 种方案,总方案数 \(\sum\limits_{s=1}^{n-3}(k-s-2)h_{s+1}h_{k-s-1}\)。
(感谢 jijidawang)
于是 \(h_k=(k-1)h_{k-1}+\sum\limits_{s=1}^{n-3}(k-s-2)h_{s+1}h_{k-s-1}\)。
考虑 DP,设 \(f_{l,r,s,d}\) 表示 \([l,r]\) 是一个合点,有 \(s\) 个孩子,形成 \(d\) 个连续段的方案数,
\(g_{l,r,s,d}\) 表示 \([l,r]\) 是一个析点,孩子中有 \(s\) 个非法叶子,形成 \(d\) 个连续段的方案数,
转移类似区间 DP,按区间长度从小到大枚举 \([l,r]\),再枚举 \([l,r]\) 中的点 \(k\),考虑在 \([l,k]\) 形成的点上挂一个 \([k+1,r]\) 孩子即可。
考虑 \(m_i\) 的限制,根据上文,连续段只能产生于合点的连续的若干个儿子与析点本身,
所以转移时使那些不该成为连续段的区间不能成为合点的连续的若干个儿子和析点即可。
但这样复杂度是 \(O(n^8)\) 的,怎么办呢?对于计数型背包 DP,可以尝试对容量那一维插值。
以下设 \(w=n(n+1)/2\)。
具体地,设答案函数 \(z(d)=\sum\limits_{s=1}^n(f_{1,n,s,d}+g_{1,n,s,d})\),则 \(z\) 的 OGF \(F(x)=\sum\limits_{d=1}^wz(d)x^d\),
则只需要求出 \(F\) 的 \(w+1\) 个点值,就可以还原出其各项系数 \(z\)。
考虑 \(F(x)\) 的实际意义是什么,把 \(x^d\) 视为形成 \(d\) 个连续段的方案的权值,则 \(F(x)\) 就是所有方案的权值和。
在最外面枚举 \(w+1\) 种 \(x\),重新设 \(f_{l,r,s}\) 表示此时 \([l,r]\) 是一个合点,有 \(s\) 个孩子的方案的权值和,
\(g_{l,r,s}\) 表示此时 \([l,r]\) 是一个析点,孩子中有 \(s\) 个非法叶子的方案的权值和,转移同上,即可算出所有方案的权值和。
考虑得到了 \(w+1\) 个点值 \((x_i,y_i)\) 后,怎么还原出 \(F\) 的各项系数 \(z\)。
首先可以构造 \(F(x)=\sum\limits_{i=1}^{m+1}y_i\prod\limits_{j\ne i}\dfrac{x-x_j}{x_i-x_j}=\sum\limits_{i=1}^{m+1}\dfrac{y_i}{\prod\limits_{j\ne i}(x_i-x_j)}\prod\limits_{j\ne i}(x-x_j)\),
对于每个 \(i\),\(\dfrac{y_i}{\prod\limits_{j\ne i}(x_i-x_j)}\),只需要计算 \(G_i(x)=\prod\limits_{j\ne i}(x-x_j)\)。
设 \(H(x)=\prod\limits_{i=1}^{m+1}x-x_j\),则 \(H(x)=G_i(x)(x-x_i)\),两边提取系数得:
解方程得:
这样就可以递推 \(G_i(x)\) 的各项系数了。把每个 \(G_i(x)\) 递推出来即可,复杂度 \(O(m^2)\)。
总复杂度瓶颈在之前的 DP,总复杂度为 \(O(n^6)\)。

浙公网安备 33010602011771号