题干:
 

众所周知,IG是英雄联盟S8世界总决赛冠军,夺冠之夜,数亿人为之欢呼!

赛后某百分百胜率退役ADC选手的某表情包意外走红,某苟会长看到此表情包也想模仿。

于是有n个友爱的萌新决定每人都送会长一根长为ai面包。(数据保证没有面包的长度相等)

会长无聊时把面包摆成一排,他惊人地发现他喜欢这样一类区间,区间[i, j]满足条件:

区间里的面包没有比左端点i号面包短的,同时也没有比右端点j号面包长的。

Gey会长在思考这样一个问题:
 

所有满足条件的区间中j-i的最大值是多少?

输入描述:

t组数据。

每组样例第一行输入整数n,接下来一行输入n个正整数。

(t≤30, n≤1000, ai≤1000000)

输出描述:

输出满足条件的区间中j-i的最大值。

示例1

输入

复制

2
4
5 4 3 6
4
6 5 4 3

输出

复制

1
0

解题报告:

  n=1e4其实可以直接暴力,不需要单调栈。。(当做复习了)

  但是最后还是枚举的端点n^2了,,这题好像可以直接On的单调栈吧。。就跟那个暑假的题一样的单调栈、、、抽空补了

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<stack>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
int n;
int a[MAX];
ll ans;
int R[MAX];
int L[MAX];
stack<int> sk;//递增栈 
int main()
{
	int t;
	cin>>t;
	while(t--) {
		cin>>n;
		for(int i = 1; i<=n; i++) scanf("%d",a+i);
		//记录左侧第一个比它大的 
		while(!sk.empty()) sk.pop();
		for(int i = 1; i<=n; i++) {
			while(!sk.empty() && a[i] >= a[sk.top()] ) sk.pop();
			if(sk.empty()) L[i] = 0;
			else L[i] = sk.top();
			sk.push(i);
		}
		int ans = 0;
		for(int i = 1; i<=n; i++) {
			int minn = 0x3f3f3f3f,tar=L[i]+1;
			for(int j = L[i]+1; j<=i; j++) {
				if(a[j] <= minn) {
					tar=j;
					minn=a[j];
				}
			}
			ans = max(ans,i-tar);
		}
	//	printf("%d %d\n",L[4],R[4]);
		printf("%d\n",ans);
	}
	
	return 0 ;
 }