2023.8

发布时间 2023-08-02 13:50:53作者: Cry_For_theMoon

1. Good Subsegments

这个已经是典中典题了。

首先考虑一个段合法等价于 \(mx - mn = r-l\),也就是 \(mx-mn-r+l = 0\),而且注意到 \(mx-mn-r+l\ge 0\),所以如果我们全局询问的话,那就是扫描线维护,然后维护一下全局的最小值以及最小值个数就行了。

然后区间的子区间计数就考虑套维护历史信息的 trick,也就是我们还是维护扫描线的过程。操作是区间加。

然后询问的东西实质上有点牛魔的:相当于给出一个区间 \([l,r]\),首先要求这些位置的历史最小值的 \(\min\),设为 \(x\),还要求出每个位置历史值 \(=x\) 的次数和。

这个东西手搓了一下竟然自己手搓出来了:考虑对每个位置维护一个三元组 \((min,cnt,sum)\),表示该位置的历史最小值,以及历史最小值个数,还有当前的值,那么原序列上的加法(对应这个三元组的乘法)是容易的:\(+a\) 等价于乘上 \((a,1,a)\);但是我们用线段树合并的话,首先就需要定义加法,然后还需要满足分配律。

加法的话比较牛魔,先不考虑分配律,那就是 \(\min\) 是两个人的 \(\min\) 取最小值;然后 \(cnt\) 跟着算,然后 \(\sum\) 也得取 \(\min\)。但是发现他好像不满足分配律:两个一样的三元组,合并起来的话以后都是要当两份算的,但是没有体现出来。所以还要记录一下有多少个位置他的 \(sum = \min sum\),这个四元组的加法乘法满足分配律,然后就可以 seg 打 lazy 维护了。

时间复杂度 \(O(n\log n)\)

记录