解题思路:
开两个单调队列即可。
#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; }
时间: 2024-10-15 10:04:00