方法:由于满足
m
a
x
(
h
i
+
1
,
h
i
+
2
.
.
.
.
.
.
.
.
h
j
−
1
)
<
m
i
n
(
h
i
,
h
j
)
max(h_{i+1},h_{i+2}........h_{j-1})<min(h_{i},h_{j})
max(hi+1,hi+2........hj−1)<min(hi,hj)的i,j能相互看见,并且i,j的位置相互对称,也就是说i能看见j,j也能看见i,所以我们计算一方看见另一方就可以了,这样我们就可以调整计算顺序,我们可以试着求从左往右看的情况,由于往左看的时候只能看到比自己矮的山,并且由于自身比他们高,其他后续的山是看不到的,所以他们被看完就毫无作用了,这种模式可以用单调栈来处理,栈内元素从栈底到栈顶根据刚才的描述应该是逐渐减少的,,每次入栈时维护但单调栈的性质,维护时出栈的元素个数为当前元素能看见山的个数,最后我们要求的是刚刚对于每个元素所求的数量和。由于这种区间和我们要求好几次,所以想到用前缀和。 加上屏障之后若我们只计算过从右往左看的前缀和,那么我们只能得到屏障左半段的前缀和,但是右半段由于前缀和受到左半段元素的影响不能计算独立的右半段,所以我们还要计算从左往右看的前缀和,(如果你看不懂我说的有可能你想的前缀和和我想的不一样,这里我的前缀和的相加顺序可以看程序的做法),这样就能计算右半锻的防护能力,而不受到左半段元素的影响。