题意
在一个整数序列中,找到一个最长的子序列,满足该子序列的最大元素与最小元素的差值不小于 m 也不大于 k。
题解
用单调队列维护前 i 个元素的最大和最小值。
参考
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
const int maxn = 100000 + 10;
int a[maxn];
int n, m, k;
int maxQue[maxn], minQue[maxn];
// 109MS 2416K
void solve()
{
int mintail = 0, minhead = 0, maxtail = 0, maxhead = 0;
int ans = 0, st = 0;
for(int i = 0; i < n; ++i){
while(minhead < mintail && a[minQue[mintail - 1]] >= a[i]) --mintail;
minQue[mintail++] = i;
while(maxhead < maxtail && a[maxQue[maxtail - 1]] <= a[i]) --maxtail;
maxQue[maxtail++] = i;
while(a[maxQue[maxhead]] - a[minQue[minhead]] > k){
if(maxQue[maxhead] < minQue[minhead]) st = maxQue[maxhead++] + 1;
else st = minQue[minhead++] + 1;
}
if(a[maxQue[maxhead]] - a[minQue[minhead]] >= m) ans = max(ans, i - st + 1);
}
cout << ans << endl;
}
int main()
{
while(cin >> n >> m >> k){
for(int i = 0; i < n; ++i) scanf("%d", a + i);
solve();
}
return 0;
}