poj 2823【單調隊列】

來源:互聯網
上載者:User

http://poj.org/problem?id=2823

基礎單調隊列。用STL的deque竟然TLE!!!無論c++還是g++。。。

而用數組做提交c++ac了,提交g++TLE不明白為啥這樣子

堆操作:先對尾部進行操作,以小根堆為例:當從尾部加入一個元素後,檢查前面時候有比他大的,有就刪除前面,而此元素就向前推進,直至沒有比它大的,沒有就直接塞入;

然後對隊列的頭進行操作:檢查下標是否滿足特定範圍之內,不滿足就刪除,最後取第一個就是當前結果。

以這題為例,操作一下這個流程,加深理解

1 3 -1 -3 5 3 6 7

隊列                                                                                  輸出

1                                                                                        

1  3

-1(1,3均比-1大,所以刪除)                                              -1

-3                                                                                         -3

-3  5                                                                                     -3

-3  3                                                                                     -3

 3  6(因為-3的下標已經超出範圍,所以要delete)              3

 3 6 7                                                                                     3

***********************************************************************我是分割線***********************************************************************

AC代碼:

#include <vector>#include <list>#include <map>#include <set>#include <queue>#include <string.h>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <limits.h>using namespace std;int lowbit(int t){return t&(-t);}int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}#define LL long long#define PI acos(-1.0)#define N  1000010#define MAX INT_MAX#define MIN INT_MIN#define eps 1e-8#define FRE freopen("a.txt","r",stdin)int Minq[N],Maxq[N];int index[N],que[N];int a[N];int n,m;void Min(){    int i,j,k;    int head=1,tail=0;    for(i=1;i<=n;i++){        while(head<=tail && que[tail]>a[i])            tail--;        tail++;        que[tail]=a[i];        index[tail]=i;        if(i>=m){            while(index[head]<i-m+1)                head++;            Minq[i-m]=que[head];        }    }}void Max(){    int i,j,k;    int head=1,tail=0;    for(i=1;i<=n;i++){        while(head<=tail && que[tail]<a[i])            tail--;        tail++;        que[tail]=a[i];        index[tail]=i;        if(i>=m){            while(index[head]<i-m+1)                head++;            Maxq[i-m]=que[head];        }    }}int main(){    while(scanf("%d%d",&n,&m)!=EOF){        int i,j,k;        for(i=1;i<=n;i++)        scanf("%d",&a[i]);        Min();        printf("%d",Minq[0]);        for(i=1;i<n-m+1;i++)printf(" %d",Minq[i]); printf("\n");        Max();        printf("%d",Maxq[0]);        for(i=1;i<n-m+1;i++)printf(" %d",Maxq[i]); printf("\n");    }    return 0;}

TLE代碼:

#include <vector>#include <list>#include <map>#include <set>#include <queue>#include <string.h>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <limits.h>using namespace std;int lowbit(int t){return t&(-t);}int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}int max(int a,int b){return a>b?a:b;}int min(int a,int b){return a>b?b:a;}#define LL __int64#define pi acos(-1)#define N  1000010#define INF INT_MAX#define eps 1e-8#define FRE freopen("a.txt","r",stdin)struct node{    int num;    int id;};deque<node> dmin,dmax;int ans[N];int main(){    //FRE;    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)    {        int i,j;        int cnt=1;        dmin.clear();        dmax.clear();        node p;        int tot=0;        while(n--)        {            scanf("%d",&p.num);            while(!dmin.empty() && dmin.front().id<cnt-m+1)dmin.pop_front();            while(!dmin.empty() && dmin.back().num>p.num)dmin.pop_back();            while(!dmax.empty() && dmax.front().id<cnt-m+1)dmax.pop_front();            while(!dmax.empty() && dmax.back().num<p.num)dmax.pop_back();            p.id=cnt++;            dmin.push_back(p);            dmax.push_back(p);            if(cnt>m)            {                a[tot++]=dmax.front().num;                printf("%d ",dmin.front().num);            }        }        printf("\n");        for(i=0;i<tot;i++)printf("%d ",a[i]);        printf("\n");    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.