ds 4.4 干净的序列

/***************
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;
} 
        


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值