HDU 3530 Subsequence

来源:互联网 发布:2017最新网络语言 编辑:程序博客网 时间:2024/06/06 17:54

这个题意是给你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);    }}


0 0
原创粉丝点击