单调队列很好的一个题目,我却傻逼的用队列写了好久,最后才发现自己脑残了。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
const int maxn=1e6+100;
int n,m,k,a[maxn],pre1,pre2,last1,last2,q1[maxn],q2[maxn];
int main()
{
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int pre=1,ans=0;
pre1=pre2=last1=last2=0;
for(int i=1;i<=n;i++)
{
while(pre1<last1&&a[q1[last1-1]]<a[i])
last1--;
while(pre2<last2&&a[q2[last2-1]]>a[i])
last2--;
q1[last1++]=i;
q2[last2++]=i;
while(pre1<last1&&pre2<last2&&a[q1[pre1]]-a[q2[pre2]]>k)
{
if(q1[pre1]<q2[pre2])
pre=q1[pre1++]+1;
else
pre=q2[pre2++]+1;
}
if(pre1<last1&&pre2<last2&&a[q1[pre1]]-a[q2[pre2]]>=m)
ans=max(ans,i-pre+1);
}
printf("%d\n",ans);
}
return 0;
}