CF1542D Priority Queue

模拟赛的题,做了一下加强把删除操作改成了删除第 \(k\) 小,如果不行就无视的情况。

发现只有加数操作会对答案有贡献,故考虑每一个加数有多少种方案不会被删掉。那么我们先来考虑动规需要什么。发现因为改成了第 \(k\) 小,所以需要记录一下 \(f(i,j,k)\) 表示前 \(i\) 个操作,\(j\) 为第 \(k\) 小的数的方案数。发现不会算重因为我们最后做了一下钦定,所以这么记录是可以的。我们考虑转移。

对于 \(j>i\) 的情况,因为还没有出现过,所以可以认为前面需要填 \(k-1\) 个数。对于加操作,如果 \(x_i>x_j\) 则没有影响,因为在 \(k\) 的后面,否则会多一个,需要从前面 \(k-1\) 进行转移。对于减操作则有如果 \(v_i>k\),那么就说明没有影响,还是从原来的 \(k\) 转移。如果 \(v_i=k\),那么可以从 \(k\)\(k+1\) 进行转移,考虑的是删除是否有效的方案。对于 \(v_i<k\),则必须从 \(k+1\) 转移了。

对于 \(j=i\),直接从 \(i-1\) 转移即可。

对于 \(j<i\) 基本上和 \(j>i\) 同理,只不过没有删除无效的情况了。

转移方程写出来有点复杂,但是非常好推。设 \(s_i=1\) 代表是加操作,\(0\) 为减操作。

\[ f(i,j,k)= \begin{cases} 2f(i-1,j,k) &s_i=1\land((j>i\land x_i>x_j)\lor(j<i\land x_i\geq x_j))\\ f(i-1,j,k)+f(i-1,j,k-1) &s_i=1\land((j>i\land x_i\leq x_j)\lor(j<i\land x_i<x_j))\\ f(i-1,j,k)+f(i-1,j,k) &s_i=0\land x_i>x_j\land i\neq j \\ f(i-1,j,k)+f(i-1,j,k)+f(i-1,j,k+1) &s_i=0\land j>i \land x_i=x_j\\ f(i-1,j,k)+f(i-1,j,k+1) &s_i=0\land((j>i\land x_i<x_j)\lor(j<i\land x_i\leq x_j))\\ f(i-1,j,k) &j=i\\ \end{cases} \]

那么之后对于每一个 \(s_i=1\),都有对答案的贡献 \(x_i\sum_{j=1}^n f(n,i,j)\)

时间复杂度 \(O(n^3)\)

posted @ 2025-11-08 15:26  tanghg  阅读(14)  评论(0)    收藏  举报