标签:单调序列
这个题意是给你n个数,然后寻找一个区间,区间的最大值与最小值的差要小于k并且大于m
思路:
用两个单调序列维护这个序列,显而易见用当前者两个单调序列的列首相减如果大于k的话那么,我们就要寻找列首在序列位置比较小的那个往后面加1。这个题目的难点在于题目意思是区间,我理解错了。以为是那种最长公共子序列那种。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int last,head;
int n,m,k;
int a[111111];
int que1[111111];
int que2[111111];
int pa[111111];
int pb[111111];
int main(){
while(scanf("%d%d%d",&n,&m,&k)!=EOF){
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int l1=0;
int l2 = 0;
int ans = 0;
int l = 0;
int r1 = -1;
int r2 = -1;
for(int i=1;i<=n;i++){
while(l1<=r1&&a[que1[r1]]>a[i]) --r1;
while(l2<=r2&&a[que2[r2]]<a[i]) --r2;
que1[++r1] = i;
que2[++r2] = i;
while(a[que2[l2]]-a[que1[l1]]>k){
if(que1[l1]<que2[l2]) l = que1[l1++];
else l = que2[l2++];
}
if(a[que2[l2]]-a[que1[l1]]>=m&&a[que2[l2]]-a[que1[l1]]<=k)
ans = max(ans,i-l);
}
printf("%d\n",ans);
}
}版权声明:都是兄弟,请随意转载,请注明兄弟是谁
标签:单调序列
原文地址:http://blog.csdn.net/u013076044/article/details/46929877