http://acm.hznu.edu.cn/OJ/problem.php?cid=1263&pid=5

http://acm.hznu.edu.cn/OJ/problem.php?id=2584

题意:设f[i]=max(f[i-1],s[i])ans=∏min(m[i],f[i])m[i]f[i]可修改。

题解:

  线段树维护每个区间[l,r]且只考虑[l,r]的以下信息:

  fl,frf[l]f[r]的值

  mul∏min(m[i],f[i])

  rmul:将右儿子用左儿子的f修正后右儿子的贡献

  对于mul,有mul=左儿子的mul*ask(右儿子,左儿子的f[r])

  其中ask(x,pre)表示考虑x的子树,之前fpre时的乘积。

 

  若fl>=pre,则无需修正,直接返回mul即可。

  x为叶子,则暴力处理即可。

  若左儿子的fr>=pre则右儿子只会被左儿子修正,返回ask(左儿子,pre)*mul

  否则左儿子将全部被修正为pre,故返回ask(右儿子,pre)*左儿子全部修正为pre的贡献即可,贡献可以在每个节点上套上一棵Treap进行O(logn)计算。