题解:P3352 [ZJOI2016] 线段树

首先,题目上说让期望乘上 \((\frac{n(n+1)}{2})^q\) 的目的就是让我们求方案数与值的乘积。

然后我们考虑在操作过后一个位置上的值相对于原来的值肯定是不降的,于是可以想到对每一个值 \(v\) ,原序列中所有 \(\le v\) 的元素一定构成了若干连续的区间。对每一个这样的区间而言,操作过后这个区间的左右端点一定是向中间移动的。

于是我们可以对每个区间都考虑一个 DP。设 \(dp_{v,x,l,r}\) 表示操作 \(x\) 次后区间 \([l,r]\) 中的数字均 \(\le v\),且第 \(l-1\)\(r+1\) 个元素都 \(\gt v\) 的方案数。

转移的话显然可以从 \(dp_{v,x-1,l,r},dp_{v,x-1,i,r},dp_{v,x-1,l,i}\) 转移过来。具体的,第一种转移相当于第 \(x\) 次操作对于区间 \([l,r]\) 来说应该是无用的,即操作区间 \([1,l-1],[l,r],[r+1,n]\) 的总方案数。第二种和第三种转移类似,以第二种为例,相当于第 \(x\) 次操作应当在区间 \([1\sim i-1,l-1]\) 进行,这个可以使用两个前缀和优化。转移方程就不写了,其中 \(x\) 这一维显然可以滚掉。

回到题面,我们现在要解决的问题就是求每个数字最终大小为某个定值时的方案数。上述 DP 求的是每个区间最终值不大于某个定值时的方案数,那我们对于一个区间 \([l,r]\) 而言,若用 \(f(j)\) 表示 \(dp_{j,q,l,r}\),那么这个区间最终值等于 \(j\) 的方案数显然就是 \(f(j)-f(j-1)\)

这样对于每一个元素,我们只需要找到所有包含它的区间,再对于这个元素在该区间内可能变成的所有值都累加答案即可。根据定义,可以保证方案不会重复。

根据数据随机的条件,时间复杂度近似 \(\mathcal{O}(n^2q)\),可以通过本题。

posted @ 2024-10-29 11:14  Redamancy_Lydic  阅读(10)  评论(0编辑  收藏  举报