# HDU 3530subsequence (monotone queue)

Posted by bigmichael on Wed, 01 Jan 2020 14:34:40 +0100

## 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.

\$> = 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;
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++) {
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
*/```

Topics: C++