码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 3530 Subsequence

时间:2015-07-17 18:54:39      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:单调序列

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


版权声明:都是兄弟,请随意转载,请注明兄弟是谁

HDU 3530 Subsequence

标签:单调序列

原文地址:http://blog.csdn.net/u013076044/article/details/46929877

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!