【bzoj2096】 [Poi2010]Pilots

Description

Tz又耍畸形了?。∷旓w行員,他拿到了一個飛行員測試難度序列,他設定了一個難度差的最大值,在序列中他想找到一個最長的子串,任意兩個難度差不會超過他設定的最大值。耍畸形一個人是不行的,于是他找到了你。

Input

輸入:第一行兩個有空格隔開的整數(shù)k(0<=k<=2000,000,000),n(1<=n<=3000,000),k代表Tz設定的最大值,n代表難度序列的長度。第二行為n個由空格隔開的整數(shù)ai(1<=ai<=2000,000,000),表示難度序列。

Output

輸出:最大的字串長度。

Sample Input

3 9
5 1 3 5 8 6 6 9 10

Sample Output

4

(有兩個子串的長度為4: 5, 8, 6, 6 和8, 6, 6, 9.最長子串的長度就是4)

維護兩個單調隊列,一個單增,一個單減

#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
const int N=3000005;
int a[N],n,q1[N],l1,r1,q2[N],l2,r2,k,ans,w1[N],w2[N],wz;
int main (){
    scanf ("%d%d",&k,&n);
    r1=r2=-1;
    for (int i=1;i<=n;++i)scanf ("%d",&a[i]);
    for (int i=1;i<=n;++i){
        for (;l1<=r1 && q1[r1]>=a[i];--r1);q1[++r1]=a[i];w1[r1]=i;
        for (;l2<=r2 && q2[r2]<=a[i];--r2);q2[++r2]=a[i];w2[r2]=i;
        for (;q2[l2]-q1[l1]>k;wz=(w1[l1]>w2[l2])?(w2[l2++]):(w1[l1++]));
        ans=max(ans,i-wz);
    }
    printf ("%d",ans);
    return 0;
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容