POJ2823

来源:互联网 发布:随身带了淘宝去异界 编辑:程序博客网 时间:2024/06/06 08:55

这道题应该有三种解法

1:线段树

2:单调队列

3:ST算法

下面的代码是

#include <iostream>#include<stdio.h>using namespace std;struct  elem{    int pos;    int val;};elem  maxqueue[1000005];elem  minqueue[1000005];int maxn[1000005];int minn[1000005];int minhead,mintail;int maxhead,maxtail;int main(){    int n,k;    scanf("%d%d",&n,&k);        minhead=mintail=maxhead=maxtail=0;        int i;        int num;        for(i=0;i<k;i++)        {            scanf("%d",&num);            while(maxhead<maxtail&&maxqueue[maxtail-1].val<num)            {                maxtail--;            }            maxqueue[maxtail].val=num;            maxqueue[maxtail].pos=i;            ++maxtail;            while(minhead<mintail&&minqueue[mintail-1].val>num)            {                mintail--;            }            minqueue[mintail].val=num;            minqueue[mintail].pos=i;            ++mintail;        }        int current=0;        for(i=k;i<n;i++)        {             scanf("%d",&num);             maxn[current]=maxqueue[maxhead].val;             minn[current]=minqueue[minhead].val;             //cout<<maxn[current]<<" "<<minn[current]<<endl;             ++current;             while(maxhead<maxtail&&i-maxqueue[maxhead].pos>=k)                maxhead++;             while(maxhead<maxtail&&maxqueue[maxtail-1].val<num)                maxtail--;             maxqueue[maxtail].val=num;             maxqueue[maxtail].pos=i;             maxtail++;             while(minhead<mintail&&i-minqueue[minhead].pos>=k)                minhead++;             while(minhead<mintail&&minqueue[mintail-1].val>num)                mintail--;            minqueue[mintail].val=num;            minqueue[mintail].pos=i;            mintail++;        }        maxn[current]=maxqueue[maxhead].val;        minn[current]=minqueue[minhead].val;        current++;        for(i=0;i<current;i++)        {            cout<<minn[i]<<" ";        }        cout<<endl;        for(i=0;i<current;i++)        {            cout<<maxn[i]<<" ";        }        cout<<endl;}


0 0