[BZOJ2096][POI]Pilots

来源:互联网 发布:碧空尽知什么 编辑:程序博客网 时间:2024/05/23 00:01

POI数据范围神题

单调队列维护区间最大值和区间最小值

每次超过k的时候优先弹出那个靠前的 这样比较优

更新的时候千万注意 你是拿出来了比那个刚好不行的稍微大那么1的点

因此你更新的时候一定要记得+1

虽然我也不知道为什么直接拿区间点更新为什么不行……但是他就是不行……

即使我改过了初始答案也不行……哪位神犇假如知道第二段代码该怎么改请告诉我

#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<queue>#include<stack>#include<map>#include<set>#include<algorithm>#include<iomanip>using namespace std;typedef pair<int,int> pii;const int INF = 0x7f7f7f7f;inline long long init(){    long long now=0,ju=1;char c;bool flag=false;    while(1)    {        c=getchar();        if(c=='-')ju=-1;        else if(c>='0'&&c<='9')        {            now=now*10+c-'0';            flag=true;        }        else if(flag)return now*ju;    }} inline int read(){    int now=0,ju=1;char c;bool flag=false;    while(1)    {        c=getchar();        if(c=='-')ju=-1;        else if(c>='0'&&c<='9')        {            now=now*10+c-'0';            flag=true;        }        else if(flag)return now*ju;    }}int inqueue[3000005],dequeue[3000005],inhead=1,dehead=1,intail=0,detail=0;long long a[3000005],n,m;int main(){    //freopen("in.txt","r",stdin);    //freopen("a.txt","w",stdout);    m=init();n=init();    for(int i=1;i<=n;i++)    {        a[i]=init();    }    int ans=0;    int tmp=1;    for(int i=1;i<=n;i++)    {        while(a[i]<=a[inqueue[intail]]&&intail>=inhead)        {            intail--;        }        inqueue[++intail]=i;        while(a[i]>=a[dequeue[detail]]&&detail>=dehead)        {            detail--;        }        dequeue[++detail]=i;        while(a[dequeue[dehead]]-a[inqueue[inhead]]>m&&inhead<=intail&&dehead<=detail)        {            if(inqueue[inhead]<dequeue[dehead])            {                tmp=inqueue[inhead]+1;                inhead++;            }            else            {                tmp=dequeue[dehead]+1;                dehead++;            }        }        ans=max(ans,i-tmp+1);    }    printf("%d\n",ans);    return 0;}

WrongAnswer:

 #include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<queue>#include<stack>#include<map>#include<set>#include<algorithm>#include<iomanip>using namespace std;typedef pair<int,int> pii;const int INF = 0x7f7f7f7f;inline long long init(){    long long now=0,ju=1;char c;bool flag=false;    while(1)    {        c=getchar();        if(c=='-')ju=-1;        else if(c>='0'&&c<='9')        {            now=now*10+c-'0';            flag=true;        }        else if(flag)return now*ju;    }} inline int read(){    int now=0,ju=1;char c;bool flag=false;    while(1)    {        c=getchar();        if(c=='-')ju=-1;        else if(c>='0'&&c<='9')        {            now=now*10+c-'0';            flag=true;        }        else if(flag)return now*ju;    }}int inqueue[3000005],dequeue[3000005],inhead=1,dehead=1,intail=0,detail=0;long long a[3000005],n,m;int main(){    //freopen("in.txt","r",stdin);    //freopen("a.txt","w",stdout);    m=init();n=init();    for(int i=1;i<=n;i++)    {        a[i]=init();    }    int ans=1;    int tmp=1;    for(int i=1;i<=n;i++)    {        while(a[i]<=a[inqueue[intail]]&&intail>=inhead)        {            intail--;        }        inqueue[++intail]=i;        while(a[i]>=a[dequeue[detail]]&&detail>=dehead)        {            detail--;        }        dequeue[++detail]=i;        while(a[dequeue[dehead]]-a[inqueue[inhead]]>m&&inhead<=intail&&dehead<=detail)        {            if(inqueue[inhead]<dequeue[dehead])            {                tmp=inqueue[inhead];                inhead++;            }            else            {                tmp=dequeue[dehead];                dehead++;            }        }        ans=max(ans,i-tmp);    }    printf("%d\n",ans);    return 0;}



0 0