P5972 [PA 2019] Desant

很有意思的题。
\(n \le 40\) 提示我们思考非多项式复杂度的做法。
显然有 \(\mathcal{O}(n2^n)\) 的暴力,无法通过。
回归本质,想想这玩意为啥不行,主要是因为我们每次都要记录选数的集合,但这是不必要的,因为我们在求逆序对,所以我们只需要知道前面有多少比自己大的数,但是这不好转移。
再想想,如果我们选了 \(a_i\),那么会对后面的选择产生多少贡献呢,显然是会对后面比 \(a_i\) 小的数产生 \(1\) 的贡献,我们考虑把这个东西设计到状态里。
考虑一个很暴力的想法:设 \(a_i, a_{i + 1}, a_{i + 2}, \dots, a_n\) 升序排序后是 \(x_1, x_2, \dots, x_{n-i + 1}\),且将数轴划分成了 \([1, x_1), (x_1, x_2), (x_2, x_3), \dots, (x_{n-i+1}, n]\) 这些区间,选 \(a_i\) 的话,假设 \(a_i=x_k\),那么产生的逆序对数就是在 \(i\) 之前选的数 \(a_j\) 在 \((x_k, x_{k+1}), \dots, (x_{n-i+1}, n]\) 这些区间中的 \(j\) 的数量,那么考虑对于每个区间记录之前选的 \(a_j\) 在这个区间中的数量,记为这个区间的权值。同时每次不管选不选 \(i\) 都会合并 \((x_k, x_{k+1})\) 和 \((x_{k+1}, x_{k+2})\) 两个区间。这个东西的本质就是扣掉了之前不可能会选的数 \(a_i, a_{i+1}, \dots, a_n\),然后就划出了若干个区间。
然后我们惊人地发现:这玩意状态数非常少!于是我们直接使用变进制状压就对了。
这里是证明(比较粗略):由于区间里有开区间也有半闭半开区间,为了实现方便我们默认区间长度为 \(r - l\),那么区间之和就是 \(n\) 了。于是问题转化为 \(N\) 个数 \(a_1, a_2, \dots, a_N\) 和为定值 \(M\),求 \(\prod a_i\) 的最大值。首先由均值不等式,\(\prod a_i \le (\frac{M}{N})^N\),当且仅当 \(a_1=a_2=\dots=a_N=\frac{M}{N}\) 时取等。此时 \(M=n, N=n-i+1\),于是状态数为 \(\sum\limits_{i=1}^n (\frac{n}{n-i+1})^{n-i+1}\),跑一下发现 \(n=40\) 的时候大概是 \(23573116\),然后随便转移就过了,因为其实跑不满。
时间复杂度 \(\mathcal{O}(n^2\sum\limits_{i=1}^n (\frac{n}{n-i+1})^{n-i+1})\)。实际上还是跑不满。
对于其他题解所说的状态数上界为 \(3^{n/3}\) 感觉不准确,毕竟这里段数是固定的。~但是实际这个上界并没有很宽,大抵是因为 \(n\) 较大时瓶颈就在 \(3\) 那里~。
实现可以参考这位大蛇的。

浙公网安备 33010602011771号