程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> hdu 3530 單調隊列水題

hdu 3530 單調隊列水題

編輯:關於C++


給你一個數列找到最長的子序列 中的最大值減最小值值m k之間



建立兩個單調隊列 一個遞增 一個遞減 當兩個隊首滿足情況是就進行比較 找到最大值

當不滿足是舊的移動隊首 怎樣移???

移動隊首id較小的一個


#include
#include
#include
using namespace std;
int max(int a,int b)
{
    return a>b?a:b;
}
int abs(int a)
{
    return a<0?-a:a;
}
int main()
{
    int n,m,k,i,j;
    int num[100010];
    int ma[100010],mi[100010];
    int ida[100010],idi[100010];
    while(~scanf("%d%d%d",&n,&m,&k))
    {
        for(i=1;i<=n;i++)
        scanf("%d",&num[i]);
        int fax=0,tax=0;
        int fin=0,tin=0;
        int tt=0;
        int now=0;
        for(i=1;i<=n;i++)
        {
            while(fax<tax&&ma[tax]<=num[i]) tax--;
            ma[++tax]=num[i];
            ida[tax]=i;
            while(fin<tin&&mi[tin]>=num[i]) tin--;
            mi[++tin]=num[i];
            idi[tin]=i;
            while(ma[fax+1]-mi[fin+1]>k&&fax<tax&&fin<tin)
            {
                if(ida[fax+1]<=idi[fin+1])
                {
                    fax++;
                    now=ida[fax];
                }
                else
                {
                    fin++;
                    now=idi[fin];
                }
            }
            if(ma[fax+1]-mi[fin+1]>=m)
            tt=max(tt,i-now);
        }
        printf("%d\n",tt);
    }
    return 0;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved