NamomoCamp Daily 1
codeforces原题网址https://codeforces.com/contest/817/problem/D
代码源oj网址http://oj.daimayuan.top/problem/436
题解:
对于每一个数,我们考虑这个数在所有区间的总贡献。
当以这个数为最小值时,计算出向左可以延伸的长度,以及向右延伸的长度,从而计算以其为最小值的总区间个数。
同理,当以这个数为最大值时,计算两边可延伸的长度,从而计算总区间个数。
这一步可以利用单调栈来实现。
在一个数
a
i
a_i
ai为最小值的所有区间,那么
a
n
s
ans
ans便要减去
a
i
∗
m
i
n
_
s
u
m
i
a_i*min_sum_i
ai∗min_sumi,即在这些区间里面,
a
i
a_i
ai都处于减数的位置。
而在
a
i
a_i
ai为最大值的所有区间,
a
n
s
ans
ans便要加上
a
i
∗
m
a
x
_
s
u
m
i
a_i*max_sum_i
ai∗max_sumi,即每个
a
i
a_i
ai都处于被减数的位置。
注意
要注意反着做单调栈时,相同元素是否需要留在栈内。
代码
// Good Good Study, Day Day AC.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include