BZOJ1342 单调队列

来源:互联网 发布:征管基础数据核实表 编辑:程序博客网 时间:2024/06/16 15:07

两个单调队列 一个递减一个递增 做的时候如果当前点-队首大于m l++ 这样就保证了区间长度为m

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define N 1001000#define inf 0x3f3f3f3fusing namespace std;int id1[N],x1[N],l1,r1;int id2[N],x2[N],l2,r2;int n,m,p,s[N];int main(){    int i;    scanf("%d%d%d",&n,&m,&p);    for(i=1;i<=n;i++)scanf("%d",&s[i]);    l1=l2=1,r1=r2=0;    int flag=1;    for(i=1;i<=n;i++)    {        while(l1<=r1&&i-id1[l1]>=m)l1++;        while(l2<=r2&&i-id2[l2]>=m)l2++;        while(l1<=r1&&s[i]>=x1[r1])r1--;        while(l2<=r2&&s[i]<=x2[r2])r2--;        id1[++r1]=id2[++r2]=i;        x1[r1]=x2[r2]=s[i];        if(i>=m)if(x1[l1]-x2[l2]<=p)            printf("%d\n",i-m+1),flag=0;    }    if(flag)puts("NONE");    return 0;}
原创粉丝点击