hdu3530(单调队列)

题意:有整数的序列。 您的任务是找到满足以下条件的最长子序列:子序列的最大元素与最小元素之间的差值不小于m且不大于k。

维护两个单调队列,一个最大,一个最小,然后根据两个队列队首元素的差值剔除队首元素。 然后更新最大长度。

答案的初始值要为0,为1则wa,因为当一个元素时,最大,最小都是他,有可能不满足大于M的情况。

#include
#include
#include
using namespace std;
const int maxn = 100000+10;
int num[maxn];
int q1[maxn],q2[maxn];
int main()
{
    int n,m,k;
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)    
    {
        int fr1=0,fr2=0,ba1=0,ba2=0,nows = 1,ans=1;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&num[i]);
            while(fr1num[i]) ba2--;
            q1[ba1++] = i; q2[ba2++] = i;
            while(fr1k)
            {
                if(q1[fr1]=m)
            {
                ans = max(ans,i-nows+1);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(单调队列&单调栈)