joj 2660: 河床 求最长区间满足条件(0<=max-min<=k) 单调队列

 2660: 河床

Result TIME Limit MEMORY Limit Run Times AC Times JUDGE
2s 32768K 367 50 Standard

地理学家对一段河床进行测量分析。他们从上游到下游等距离的选择了n(<=30000)个水位点深度。得到一组数据d1,d2...dn,且都是非负整数(di<=32767)。回到试验室后数据分析员根据需要对数据进行分析,发觉隐藏在数据背后的规律。最近,Dr.Sun 发现某种水文现象与河床地势有关,于是他指示分析员找出一段河流中最大高低起伏差不超过k(k<=100)的最长一段。

Input

输入包含多个case 每个case的第一行为整数n和k 每个case第二行有n个数,为d1,d2,...dn 当n = m = 0时代表输入的结束

Output

每一行输出起伏不超过k的河流最长长度。

Input

6 2
10 7 6 5 6 7
0 0

Output

5
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100005;
int Q_max[maxn],I_max[maxn];
int Q_min[maxn],I_min[maxn];
int a[maxn];
int main()
{
    int n,m=0,k;
    while(scanf("%d%d",&n,&k)==2,n||k)
    {
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        int head_max=0,tail_max=-1;
        int head_min=0,tail_min=-1;
        int now=1;
        int _max=0;
        for(int i=1;i<=n;i++)
        {
            //a[i]入队
            while(head_max<=tail_max&&Q_max[tail_max]<=a[i]) tail_max--;
            while(head_min<=tail_min&&Q_min[tail_min]>=a[i]) tail_min--;
            tail_max++;Q_max[tail_max]=a[i],I_max[tail_max]=i;
            tail_min++;Q_min[tail_min]=a[i],I_min[tail_min]=i;
            while(Q_max[head_max]-Q_min[head_min]>k)
            {
                if(I_max[head_max]>I_min[head_min]) now=I_min[head_min]+1,head_min++;
                else now=I_max[head_max]+1,head_max++;
            }
            if(Q_max[head_max]-Q_min[head_min]>=m&&Q_max[head_max]-Q_min[head_min]<=k)
            {
                if(i-now+1>_max) _max=i-now+1;
            }
        }
        printf("%d/n",_max);
    }
    return 0;
}

你可能感兴趣的:(数据分析,input,output)