单调队列 HDU 3530 Subsequence

来源:互联网 发布:禁止上网软件 编辑:程序博客网 时间:2024/05/22 08:17

要注意的一点是:如果差值要大于k则要在已有的单调队列中删去最大或者最小值;

如果小于m,在已有的单调队列中改动是没有用的,应该引进新的数值:

#include<bits/stdc++.h>    using namespace std;int num[100000+10];int main(){    int n,m,k;    while(scanf("%d%d%d",&n,&m,&k)!=EOF){        for(int i=1;i<=n;i++){            scanf("%d",&num[i]);        }        deque<int>maxq;        deque<int>minq;        int l=1;        int r=1;        int ans=0;        while(r<=n){            while(!minq.empty()&&num[r]<minq.back())                minq.pop_back();            minq.push_back(num[r]);            while(!maxq.empty()&&num[r]>maxq.back())                maxq.pop_back();            maxq.push_back(num[r]);           while(!maxq.empty()&&!minq.empty()&&maxq.front()-minq.front()>k){                    if(num[l]==maxq.front())                        maxq.pop_front();                    if(num[l]==minq.front())                        minq.pop_front();                l++;            }            if(!maxq.empty()&&!minq.empty()&&maxq.front()-minq.front()>=m)                ans=max(ans,r-l+1);            r++;        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击