【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\) 的最小花费,容易得到:
其中,\(cost(i,j)\) 表示从 \(i\) 到 \(j\) 的花费
暴力转移是 \(O(nq^2)\) 的,我们拿到了 10pts
考虑优化转移,转移可以写成这样的形式:
考虑在求解 \(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)\)