poj2823

来源:互联网 发布:geekbar 知乎 编辑:程序博客网 时间:2024/06/13 03:16

单调队列 的 实现 (自己瞎编的)

10000多k 5000多ms

#include <iostream>#include <cstdio>#include <queue>#include <vector>#include <cstring>using namespace std;int a[1000001],b[1000001],index[1000001],n,k;vector<int> s;vector<int> l;void solve_s(){    int head_index,start=1,medge=0;    for(int i=1;i<=k;++i)    {        while(medge>=start && a[i]<b[medge])            --medge;        b[++medge] = a[i];        index[medge] = i;        if(medge==start)            head_index = i;    }    s.push_back(a[head_index]);    for(int i=k+1;i<=n;++i)    {        if(head_index <= i-k)            head_index = index[++start];        while(medge>=start && a[i]<b[medge])            --medge;        b[++medge] = a[i];        index[medge] = i;        if(medge==start)            head_index = i;        s.push_back(a[head_index]);    }}void solve_l(){    int head_index,start=1,medge=0;    for(int i=1;i<=k;++i)    {        while(medge>=start && a[i]>b[medge])            --medge;        b[++medge] = a[i];        index[medge] = i;        if(medge==start)            head_index = i;    }    l.push_back(a[head_index]);    for(int i=k+1;i<=n;++i)    {        if(head_index <= i-k)            head_index = index[++start];        while(medge>=start && a[i]>b[medge])            --medge;        b[++medge] = a[i];        index[medge] = i;        if(medge==start)            head_index = i;        l.push_back(a[head_index]);    }}int main(){    scanf("%d %d",&n,&k);    for(int i=1;i<=n;++i)        scanf("%d",&a[i]);    s.clear();    l.clear();    solve_s();    solve_l();    for(int i=0;i<s.size();++i)        printf("%d ",s[i]);    printf("\n");    for(int i=0;i<l.size();++i)        printf("%d ",l[i]);    printf("\n");    return 0;}


0 0
原创粉丝点击