【题解】ARC126D 状压DP、费用提前、折半处理

题目链接

考虑选取子序列 \(I(c_1,c2,...c_k)\) ,我们能唯一确定其代价。

令位置 \(\text{mid} =\lceil \dfrac{k}{2} \rceil\) ,将 \(\text{mid}\) 左边和右边的所有位置调整到 \(\text{mid}\)

使得这些位置是一段连续的子段,那么代价即调整的代价 + 逆序对数。

调整的代价为(对于 \(k\) 是奇数来说):

\[\sum_{i < mid} (c_{\text{mid}}-\text{mid}-i)-c_i + \sum_{i > \text{mid}} c_i - (c_{\text{mid}} + i - \text{mid}) \]

可以写成如下形式:

\[\sum_{i} a_i c_i+b,a_i\in \{0,-1,1\} \]

将费用 \(b\) 提前计算。

那么代价即右边的下标和减去左边的下标和。

折半处理。

从左往右 \(dp\) 一遍,从右往左 \(dp\) 一遍即可。

代码记录

posted @ 2021-09-20 15:03  Themaxmaxmax  阅读(176)  评论(0编辑  收藏  举报