解题思路:
开两个单调队列即可。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#define LL long long
using namespace std;
const int maxn = 100000 + 10;
int A[maxn];
int Q1[maxn];
int Q2[maxn];
int P1[maxn];
int P2[maxn];
int Min[maxn];
int Max[maxn];
int N, M, K;
int main()
{
while(scanf("%d%d%d", &N, &M, &K)!=EOF)
{
for(int i=1;i<=N;i++)
scanf("%d", &A[i]);
int head1 = 1, tail1 = 0;
int head2 = 1, tail2 = 0;
int now = 0, ans = 0;
for(int i=1;i<=N;i++)
{
while(head1 <= tail1 && A[P1[tail1]] <= A[i])
tail1--;
P1[++tail1] = i;
while(head2 <= tail2 && A[P2[tail2]] >= A[i])
tail2--;
P2[++tail2] = i;
while(A[P1[head1]] - A[P2[head2]] > K)
{
if(P1[head1] < P2[head2])
now = P1[head1++];
else
now = P2[head2++];
}
if(A[P1[head1]] - A[P2[head2]] >= M)
ans = max(ans, i - now);
}
printf("%d\n", ans);
}
return 0;
}