/***************
Problem from :
Problem describe :
利用优先级进行对最大值以及最小值的维护
开两个数组
data:
****************/
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#include<stack>
#include<queue>
#include<ctime>
#include<cstring>
#include<vector>
#include<string>
#define ll __int64
#define inf 0x3f3f3f3f3f
#define N 10005
using namespace std;
const int INF=0x3f3f3f3f;
int start=1, MAX[N], MIN[N], num[N], ans=0;
int Max_left=1, Max_right=1;
int Min_left=1, Min_right=1;
int n, m, k;
int max(int a, int b)
{
return (a>b)?a:b;
}
void solve(int id)
{
while(Max_left<Max_right&&num[MAX[Max_right-1]]<num[id]) Max_right--; //维护最大值
while(Min_left<Min_right&&num[MIN[Min_right-1]]>num[id]) Min_right--; //维护最小值
MAX[Max_right++]=id; //添加
MIN[Min_right++]=id; //添加
//使得区间内最大值与最小值的差<=k
// 之所以不必加 >=m的条件是因为 此时这段区间尚且可以继续扩展
// 所以当前最大值与最小值的差值可能小于m但是扩展后最小值和最大值可能因为更新而使得这个区间满足>=m的条件
while(Max_left<Max_right && Min_left<Min_right && num[MAX[Max_left]]-num[MIN[Min_left]]>k)
{
if(MAX[Max_left] < MIN[Min_left]) start = MAX[Max_left++]+1;
else start = MIN[Min_left++]+1;
}
// 此区间满足条件时候要进行ans比较
if(Max_left < Max_right && Min_left<Min_right && num[MAX[Max_left]]-num[MIN[Min_left]]>=m)
ans = max(ans,id-start+1);
return ;
}
int main()
{
int i, j;
scanf("%d %d %d", &n, &m, &k);
for(i=1; i<=n; i++) scanf("%d", &num[i]);
for(i=1; i<=n; i++) solve(i);
printf("%d\n", ans);
return 0;
}
ds 4.4 干净的序列
最新推荐文章于 2020-11-17 08:48:15 发布