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