2019牛客暑期多校训练营(第四场)C.sequence(单调栈+线段树)
题面
题意:
找到一个区间$[l,r]$使得$min(a_{l…r}) \cdot sum(b_{l…r})$最大。
思路
先用单调栈预处理出$a_i$作为最小值的区间,然后对于每一个$a_i$,如果是$a_i<0$,就要查询$b$在$[l,r]$内并且包含$i$的最小连续子段和,反之查询最大子段和。我们对$b$数组的前缀数组建一棵线段树,如果要查最小子段和,就是$min(pre_{i…r})-max(pre_{l…i-1})$反之即为$max(pre_{i…r})-min(pre_{l…i-1})$。时间复杂度$O(nlog(n))$
代码
1 |
|