碰到这题不会做,看题解说是单调栈,就去学了学单调栈,回头再做这题。结果在处理边界的时候犯了个很sx的错误,竟然还想了好几天才发现错误
思路:
设la[i]为从num[i]向左数第一个比num[i]小的数字的下标,ra[i]为从num[i]向右数第一个比num[i]小的数字的下标,则区间(la[i],ra[i])中的最小值就是num[i],(i-la[i])*(ra[i]-i)就是这段区间包含num[i]且num[i]为最小值的子区间个数。我做的时候是求 num[i]为区间最大值的和 - num[i]为区间最小值的和,和图片题解中处理方式不一样,思路相同。
#include <bits/stdc++.h>