解题思路
考虑用单调栈做这道题,先将数组按数值从大到小排序(带着原本的坐标排)。注意相同的数坐标大的放前面。
然后把新序列的坐标按顺序放进单调栈(单调递增),当新加入的数大于栈顶,就踢出栈顶,同时更新答案
a
n
s
=
m
a
x
(
a
n
s
,
s
t
[
1
]
−
s
t
[
t
]
)
;
ans=max(ans,st[1]-st[t]);
ans=max(ans,st[1]−st[t]);
PS:样例5 3 6 3 4 2,排完序的坐标为,3 1 5 4 2 6.
其中
5
>
2
5>2
5>2,且
5
−
2
=
3
5-2=3
5−2=3为最大
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,t,ans,st[500010];
struct c{
int x,y;
}a[500010];
bool cmp(c l,c r)
{
if(l.x==r.x)return l.y>r.y;
return l.x>r.x;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].x);
a[i].y=i;
}
sort(a+1,a+n+1,cmp);
a[++n]=(c){0,2147483600};
for(int i=1;i<=n;i++)
{
while(a[i].y>st[t]&&t>0)
{
ans=max(ans,st[1]-st[t]);
t--;
}
st[++t]=a[i].y;
}
printf("%d",ans);
}