题意:
给定序列,需要求出一段最长的子区间[i,j]满足,a[i]是严格最小,a[j]是严格最大 ,且长度不能为1,输出该长度。
-
我们用两个单调栈,minst维护位于a[i]左边且小于a[i]的元素下标,
maxst维护位于a[i]左边且大于等于a[i]的元素下标 -
枚举B所在的位置i,然后利用maxst栈得到当前B所在位置往左第一个大于等于B的位置,也就是
maxst
的栈顶maxst[top2]
,于是[maxst[top2]+1,i-1]
这段区间每个数都是小于B的。 -
然后我们只需要找到位于
maxst[top2]
右边且最近且小于B的元素即可,这些信息都储存在minst
中 -
由于单调栈中存的是下标,下标单调递增,对应的值也是单调的,所以可以在minst中二分找到这个位置。
#include<bits/stdc++.h>
using namespace std;
//#pragma GCC optimize(2)
#define ll long long
#define pii pair<int,int>
#