注意到对于全局最小值 \(x\) ,一旦我们可以合并它,我们一定会优先合并,因此 \(x\) 和与 \(x\) 相邻且更靠近起点的位置构成一个决策整体,定义为广义节点。
合并一个广义节点的贡献为 \(x\times sz+c\),然后会让 \(x\gets x+a\)。
考虑比较先后合并两个广义节点 \(x,y\) 的决策优劣,可以发现相当于比较广义节点平均值的大小。
考虑分开维护左右两侧,相当于每次将最小的 \(x\) 向起点合并,如果碰到起点就删去该块,然后会形成若干个块,考虑维护最终块的形态。
以左边为例,考虑从左向右扫描,尝试计算新加入一个数 \(x\) 对于局面的影响。
若 \(x\) 小于等于其左侧块的平均数,那么 \(x\) 会形成一个新的块。
若 \(x\) 大于其左侧块的平均数,则 \(x\) 会被合并到左边的块中。但是这次合并可能会造成这个块会被倒数第二个块合并,因此还需继续操作。
注意到数据随机,所以栈高不超过 \(\mathcal O(\log n)\),所以直接暴力做即可。
如果数据不随机,可以动态维护 \(f(x)\) 函数做到均摊 \(\mathcal O(n\log n)\)