meaning of the title
Give the number of $n $, find out the longest interval, so that the maximum number $- $minimum number $> = M $and $< = k$
Sol
Consider maintaining two monotone queues.
A maintenance $1 - i $maximum and a maintenance $1 - i $minimum.
As for the two restrictions.
$< = k $can be satisfied by adjusting the team head
$> = a $can be limited when updating answers.
I made two mistakes at the beginning
1. Using array pointer as subscript directly
2. It's not right to update the answer with the minimum number of queues. Because the team leader element may be updated later, the real answer may be better than the current one
/* */ #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<ctime> #include<cstring> #include<algorithm> #include<vector> #define Pair pair<int, int> #define MP(x, y) make_pair(x, y) #define fi first #define se second using namespace std; const int MAXN = 1e6 + 10; const double eps = 1e-10, Dlt = 0.97, INF = 1e9 + 7; inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();} while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x * f; } int N, x, y, a[MAXN]; int h1, t1, q1[MAXN], h2, t2, q2[MAXN]; int main() { while(scanf("%d %d %d", &N, &x, &y) != EOF) { int ans = 0, pre = 0; h1 = h2 = 1; t1 = t2 = 0; for(int i = 1; i <= N; i++) { a[i] = read(); while(h1 <= t1 && a[i] > a[q1[t1]]) t1--;//Hong Hong chain€A kind ofу€? while(h2 <= t2 && a[i] < a[q2[t2]]) t2--;//Hong Hong chain€Hao€? q1[++t1] = i; q2[++t2] = i; while(h1 <= t1 && h2 <= t2 && a[q1[h1]] - a[q2[h2]] > y) { if(q1[h1] < q2[h2]) pre = q1[h1], h1++; else pre = q2[h2], h2++; } if(h1 <= t1 && h2 <= t2 && (a[q1[h1]] - a[q2[h2]] >= x)) ans = max(ans, i - pre); } printf("%d\n", ans); } return 0; } /* 5 3 3 1 2 3 4 5 */