Max to the Right of Min
这个看官方题解就好了,写的很清楚,不难想到是用单调栈的
考试的时候做这道题目,显然是考虑贡献,但是方向歪了,对于一个子区间\([l,r]\),考虑的是其中的最小的元素作为代表元素,然后就一直没想出来(以最大元素作为代表元素显然是对称的,也做不出来),而官方题解是以子区间的右端点作为代表元素的,一下子就想出来了,思路也不复杂
所以代表元素的选取一定有两种情况,记住啊
update 2026.2.20
非要用最小元素作为代表元素其实也可以做。当然做法仍然比以右端点作为代表要难得多,所以仍然要把这个trick记住
先用单调栈求出每个元素左/右边比其大/小的第一个元素的位置。设\(l_{i,0}\)表示\(p_i\)左边第一个小于\(p_i\)的元素的下标,\(l_{i,1}\)表示\(p_i\)右边第一个小于\(p_i\)的元素的下标;\(r_{i,0}\)表示\(p_i\)左边第一个大于\(p_i\)的元素的下标,\(r_{i,1}\)表示\(p_i\)右边第一个大于\(p_i\)的元素的下标
然后枚举\(i∈[1,n]\),\(p_i\)作为最小元素。满足题意的区间的右端点只能在\([i+1,l_{i,1}-1]\)中选择。
一步一步考虑右端点。假设右端点是\(i+1\),并且\(r_{i+1,0}\geq l_{i,0}\),那么这个右端点对答案的贡献是\(i-r_{i+1,0}\);进一步可得,\(\forall j∈[i+1,l_{i,1}-1]\)作为右端点,其对答案的贡献是
,其中假设\(\forall k∈[i+1,j],r_{k,0}\geq l_{i,0}\)
设\(j\)满足
那么我们可以分别计算\([i+1,j-1]\)和\([j,l_{i,1}-1]\)这两段的贡献
对于前者的贡献,为
注意到
是单调不增的,所以后面那个求和式可以预处理,然后\(O(1)\)计算。预处理的具体方法如下:
设
,其中\(q_i\)可用单调栈预处理,也就可以预处理\(f_i\)
于是
但是有一种问题,就是说当\(j\)超过范围了的话,上面的式子就无法生效了。目前想不到其他的做法,只有树上倍增
对于后者的贡献,为
现在只需要找出\(j\),用二分找出来即可
时间复杂度\(O(n\log n)\)

浙公网安备 33010602011771号