【题解】「NOIP2024模拟赛27 T4」构造数据
【题解】「NOIP2024模拟赛27 T4」构造数据
https://www.becoder.com.cn/contest/5736/problem/4
\(\mathcal{Description}\)
原题:https://www.luogu.com.cn/problem/P8863
\(\mathcal{Solution}\)
设:\(m=\dfrac{\sum_{i=1}^nb_i}2\),也就是总操作次数。
先记录一下之前的思路:
把一个操作看作选两个下标匹配。
\(f_{i,j}\):前 \(i\) 个剩下 \(j\) 个没有匹配的方案数。
枚举第 \(i\) 个和前 \(i-1\) 个匹配的个数 \(k\) 转移:
\[f_{i,j}=\sum_{k=0}^{b_i}{j\choose k}gf_{i-1,j+2k-b_i}
\]
这个 \(g\) 是这 \(k\) 个匹配在整个操作序列中位置带来的贡献,跟前 \(i-1\) 个剩下的 \(j-2k-b_i\) 个未匹配的下标有关系(如果 \(i\) 跟前 \(i-1\) 中同一个下标匹配多次,因为考虑相对顺序会算重),如果暴力维护这个系数的话,感觉很复杂。
贡献提前计算!!!
又是这个……
我知道了!只要系数不好做并且依赖于以前的状态的时候就可以想到贡献提前计算。
其实整个过程也可以看作给 \(m\) 此操作分配二元组的过程。(就是官解中给的转换过程。
我们不妨也给那些没有匹配的,先在这 \(m\) 个操作中找到她们应该在的位置,后面再选到她们的时候相当于已经确定了顺序,也就不用考虑这个 \(g\) 系数了。
具体的:
\[f_{i,j}=\sum_{k=0}^{b_i}{j\choose k}{m-\frac{pre_i-j}2-j\choose b_i-k}f_{i-1,j+2k-b_i}
\]
乍看之下时间复杂度是 \(O(nm^2)\) 的,但是注意到 \(k\) 不会超过 \(b_i\),所以整个时间复杂度为 \(O(m^2)\)。
把数组滚动一下,空间复杂度就对了。