固定了最左边到达的烧烤店和最右边之后,最右策略显然是从左往右走一遍,然后每个 ticket 用在 happiness 最大的那个商店。于是不难得到一个 (mathrm O!left(n^2m ight)) 的暴力:暴力枚举区间,每个区间算出每个 ticket 的最大 happiness。
如果直接想用甚么 DS 维护上述操作的话,那我想不到什么方法。我们注意到这是又一道的算贡献题,每个区间的答案是由走路代价和 (m) 种 ticket 的代价共同贡献的。走路代价太好求了;我们考虑换贡献体:换成 ticket。
对于每个 ticket,我们考虑它在 (1sim n) 的每一种取值能影响到哪些区间。显然能影响到一个区间当且仅当它在里面最大(这里涉及到有多个最大值的问题,于是可以使用惯用套路:左边严格,右边不严格来去重)。而这些区间显然是左端点构成一个区间,右端构成一个区间,这些区间的左 / 右端点非常好求,二分 / BIT 均可,单调栈可以做到不带 log。然后就是个二维差分把它贡献到区间们上去的事情了(在这一点上我 dd 了 tzc,没有我的提醒他只知道二维线段树())。
复杂度 (mathrm O(n(n+m)))。
然后听说还有包括但不限于四边形不等式的其他方法们?考虑以后补?