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]\)作为右端点,其对答案的贡献是

\[i-\min_{k=i+1}^j(r_{k,0}) \]

,其中假设\(\forall k∈[i+1,j],r_{k,0}\geq l_{i,0}\)
设\(j\)满足

\[j=\underset{j=i+1}{\overset{l_{i,1}-1}{\text{argmin}}}(\min_{k=i+1}^j(r_{k,0})<l_{i,0}) \]

那么我们可以分别计算\([i+1,j-1]\)和\([j,l_{i,1}-1]\)这两段的贡献
对于前者的贡献,为

\[\sum_{k=i+1}^{j-1}i-\min_{l=i+1}^k(r_{l,0})=(j-i-1)\times i-\sum_{k=i+1}^{j-1}\min_{l=i+1}^k(r_{l,0}) \]

注意到

\[\min_{k=i+1}^j(r_{k,0}) \]

是单调不增的,所以后面那个求和式可以预处理,然后\(O(1)\)计算。预处理的具体方法如下:
设

\[\begin{align} q_i&=\underset{j=i+1}{\overset{n}{\text{argmin}}}(r_{j,0}<r_{i,0}) \\ f_i&=(q_i-i)\times r_{i,0}+f_{q_i} \end{align} \]

,其中\(q_i\)可用单调栈预处理,也就可以预处理\(f_i\)
于是

\[\sum_{k=i+1}^{j-1}\min_{l=i+1}^k(r_{l,0})=f_{i+1}-f_j \]

但是有一种问题,就是说当\(j\)超过范围了的话,上面的式子就无法生效了。目前想不到其他的做法,只有树上倍增
对于后者的贡献,为

\[\sum_{k=j}^{l_{i,1}-1}i-l_{i,0}=(l_{i,1}-j)\times(i-l_{i,0}) \]

现在只需要找出\(j\),用二分找出来即可
时间复杂度\(O(n\log n)\)

posted @ 2024-09-12 15:46  最爱丁珰  阅读(40)  评论(0)    收藏  举报