题目
思路
这道题有点像逆序对
首先从大到小带下标排序,满足第一个条件。
然后直接用单调栈找到最大的下标距离就好了,比较套路。
代码
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
int stack[1000010],top;
int n,ans;
struct node
{
int c,id;
}a[1000010];
bool cmp(const node&h,const node&k)
{
if(h.c!=k.c)
return h.c>k.c;
return h.id>k.id;
}
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i].c);
a[i].id=i;
}
sort(a+1,a+1+n,cmp);
for(int i=1; i<=n; i++)
{
while(top&&a[stack[top]].id<a[i].id)
top--;
ans=max(ans,a[stack[1]].id-a[i].id);
stack[++top]=i;
}
printf("%d",ans);
return 0;
}