单调栈WA40求调

题面:



代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int a[100010];
int p[100010];
int q[100010];
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
    //第一个<=
	p[n]=n;
	stack<int>s;
	s.push(n);
	for(int i=n-1;i>=1;i--){
		while(s.size()&&a[s.top()]>a[i]){
			s.pop();
		}
		if(s.size()){
			p[i]=s.top()-1;
		}else{
			p[i]=n;
		}
		s.push(i);
	}
    //第一个>=
	q[1]=1;
	while(s.size())s.pop();
	s.push(1);
	for(int i=2;i<=n;i++){
		while(s.size()&&a[s.top()]<a[i]){
			s.pop();
		}
		if(s.size()){
			q[i]=s.top()+1;
		}else{
			q[i]=1;
		}
		s.push(i);
	}
    //统计答案
	int ans=0;
	for(int i=1;i<=n;i++){
		ans=max(ans,p[i]-q[p[i]]+1);
	}
	cout<<ans;
	return 0;
}

@郑岱钦 帮个忙呗 :smiling_face_with_tear:

我在看了,我把两个栈压在一起维护,所以不太一样(but我有一个栈是<,一个是>=,这不一样)

好的

这篇题解和你比较像,可以参考(点了之后下滑到第二篇题解)