正解:莫队/线段树+扫描线
解题报告:
传送门!
似乎是有两种方法的,,,所以分别港下好了QAQ
第一种,莫队
看到这种询问很多区间之类的就会自然而然地想到莫队趴?然后仔细思考一下,发现复杂度似乎是欧克的,而且好像也是能做的,那就试着做下呗
首先考虑到怎么从[l,r]转移到[l,r+1],可以想到这个之间的增量=就是区间内最小值之和,于是用个st表搞rmq就好,这里具体港下QwQ
首先如果已经求出来了[l,r]内部的最小值的位置pos,这里不过多阐述了rmq就成了
那么分情况讨论下咯
如果a[r+1]<a[pos],那就是贡献a[r+1]*(r-l+1),不说
否则就要继续讨论
显然[l,pos]的贡献就都出来了嘛,a[pos]*(pos-l+1)
然后考虑怎么求[pos+1,r]的贡献呢QAQ?
可以考虑开俩数组lst[i]表示第i个数的左边第一个比它小的数,可以先单调栈求出来
再设sum[i]表示第1个数到第i个数的贡献
显然可以得到sum[i]=sum[lst[i]]+a[i]*(i-lst[i])
然后就可以得到总贡献=a[pos]*(pos-l+1)+sum[r+1]-sum[pos]
然后不就是莫队板子了嘛,不说了
等下放代码QAQ
第二种,线段树+扫描线
听说和影魔有点儿类似,,,?
然而我太菜了所以想不出来QAQ
所以等想到了再写QAQ反正我先去把法一代码搞了QAQ
然后再设