poj 2823【单调队列】

来源:互联网 发布:js图片上传预览删除 编辑:程序博客网 时间:2024/05/21 10:05

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;}


原创粉丝点击