AGC030D
标签
期望线性性,DP给定长度为 \(n\) 的序列 \(a\),以及 \(T\) 次操作,每次操作形如交换 \(a_{x_i}, a_{y_i}\)。每种操作都可以选择执行/不执行。
对于总共的 \(2^T\) 种操作方式,求出最终序列的逆序对对数之和。
\(n \le 3000\)。
我们肯定不能暴力算,考虑有序数对 \((i, j)\) 对答案的贡献,即有多少种操作方式使得 \(a_i > a_j\)。
令 \(f_{i, j}\) 表示当前有多少种操作方式使得 \(a_i > a_j\),对于一次操作,考虑 \(f\) 如何变化:
- 若 \(i,j \ne x \& i,j \ne y\),那么这次操作对 \(f_{i, j}\) 没有影响,\(f_{i, j} \times \! = 2\) 即可。
- 否则不妨设 \(i = x\),那么 \(f_{x, j} = f_{x, j} + f_{y, j}\),表示操作与否。其他的几种同理。(\(f_{x, y}\) 可能需要特殊处理一下)
于是就有了一个 \(O(n^2q)\) 的做法。
考虑优化。其实这个转移有一个不错的性质,就是第二种只有 \(O(n)\) 种,如果只进行 \(2\) 类转移就很棒。
如何处理第一类操作的 \(\times 2\) 操作,可以对于两种转移都 \(/2\),那么第一种就相当于不变,第二种相当于 \(f_{x, j} = (f_{x, j} +f_{y, j}) / 2\),最后乘一个 \(2^T\) 即可。
换个角度,此时的 \(f\) 其实是 \(a_i > a_j\) 的期望,拆贡献也就是期望线性性的表现。所以如果从期望的角度思考这个问题就会简单很多。
时间复杂度:\(O(n^2 + nq)\)。
这个题告诉我们:计数/期望是可以相互转化的。
浙公网安备 33010602011771号