【20211016模拟赛】Boss 题解

Statement

数轴上,给定 \(n\) 组区间,每组区间由 \(k_i\) 个区间 \([l,r]\) 组成

初始位置任意,要求从第一组区间走到第 \(n\) 组区间

要求每一步的起点在第 \(i\) 组区间内,终点在第 \(i+1\) 组区间内

每向左走一个单位长度,花费 \(A\);每向右走一个单位长度,花费 \(B\)

求最小花费。

其中,\(1\leq n\leq 2e5,1\leq l\leq r\leq 1e6,\sum k_i\leq 1e6,1\leq A,B\leq 1e6\)

\(q=1e6\)

Solution

\(dp[i][j]\) 表示当前在第 \(i\) 组区间的位置 \(j\) 的最小花费,容易得到:

\[dp[i][j]=min\{dp[i-1][k]+cost(k,j)\} \]

其中,\(cost(i,j)\) 表示从 \(i\)\(j\) 的花费

暴力转移是 \(O(nq^2)\) 的,我们拿到了 10pts

考虑优化转移,转移可以写成这样的形式:

\[dp[i][j]=\min\left\{ \begin{array}{l} dp[i-1][k]+A\times(k-j),&k> j\\ dp[i-1][k],&k=j\\ dp[i-1][k]+B\times(j-k),&k< j \end{array} \right. \]

考虑在求解 \(dp[i-1]\) 的时候顺便得到 \(dp[i-1][k]+A\times k\) 的后缀最小值和 \(dp[i-1][k]+B\times k\) 的前缀最小值,转移优化到 \(O(1)\) ,时间复杂度 \(O(nq)\)40pts

进一步优化,我们显然需要一个 \(log\) 的算法。

考虑第 \(i\) 秒的位置,它要么等于他在第 \(i+1\) 秒的位置,要么等于可行区间的端点

考虑刷新 ,那么

  • \(dp[i][j]+A\times (j-k1)\to dp[i+1][k1],j\geq k1\)
  • \(dp[i][j]+B\times (k2-j)\to dp[i+1][k2],k2\geq j\)

这里,\(j\) 为第 \(i\) 组可行区间的一个端点。

于是直接暴力枚举 \(j\) ,线段树维护区间 \(dp[i+1][k1]+k1\times A\)\(dp[i+1][k2]-k2\times B\) 的最小值即可

将第 \(i\) 组不合法的位置设置成 \(\infin\)

即是区间取 \(min\) ,单点询问,区间赋值的操作

复杂度 \(O(\sum k_i\log q)\)

posted @ 2021-10-27 16:42  _Famiglistimo  阅读(43)  评论(0编辑  收藏  举报