0%

LOJ2743 「JOI Open 2016」摩天大楼

Sol

假设 $A$ 按照从小到大排好序之后得到的数组是 $B$ 。对于相邻的两个位置,假设其中一个是 $B_i$ ,另一个是 $B_j$ ,其中 $i<j$ ,那么这两个位置对 $\sum |f_i - f_{i+1}|$ 的贡就是 $B_j - B_i = \sum_{k=i}^{j-1} (B_{i+1}-B_i)$ 。这个式子启发我们,对每个 $B_{i+1} - B_i$ 算有多少对相邻的位置满足其中一个数 $\le B_i$ 另一个 $\ge B_{i+1}$ ,就能得到 $\sum |f_{i+1}-f_i|$ 。这也等价于我们把所有 $\le B_i$ 的数插入之后得到的序列中,极大连续段的端点数。

设 $f_{i,j,k,d}$ 表示已经插入了 $i$ 个数,插入了的数在序列中形成了 $j$ 个极长的连续段,已经统计过的 $\sum |f_i-f_{i+1}|$ 的贡献和是 $k$ ,两个端点是否被占用过,对应的方案数。转移 $O(1)$ ,最后的答案是 $\sum_{j\le m} f_{n,1,j,2}$ ,总复杂度 $O(n^2m)$ 。

Code

link