裸的单调队列-poj-2823-Sliding Window

来源:互联网 发布:淘宝达人有什么用处 编辑:程序博客网 时间:2024/05/17 01:42

题目链接:

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

题目意思:

给n个数,求连续区间长度为k的最大和最小值。

解题思路:

裸的单调队列不解释,用两个队列保存。

代码:

#include<iostream>#include<cmath>#include<cstdio>#include<cstdlib>#include<string>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<set>#include<stack>#include<list>#include<queue>#include<ctime>#define eps 1e-6#define INF 0x3fffffff#define PI acos(-1.0)#define ll __int64#define lson l,m,(rt<<1)#define rson m+1,r,(rt<<1)|1#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;#define Maxn 1100000int sa[Maxn];int q1[Maxn],q2[Maxn];int ans1[Maxn],ans2[Maxn];int main(){   //freopen("in.txt","r",stdin);   //freopen("out.txt","w",stdout);   int n,k;   while(scanf("%d%d",&n,&k)!=EOF)   {       for(int i=1;i<=n;i++)            scanf("%d",&sa[i]);       int h1=0,t1=-1;       int h2=0,t2=-1,cnt=0;       for(int i=1;i<=n;i++)       {            while(h1<=t1&&sa[i]<=sa[q1[t1]])                t1--;            while(h2<=t2&&sa[i]>=sa[q2[t2]])                t2--;            q2[++t2]=i;            q1[++t1]=i;            while(q1[h1]<i-k+1)                h1++;            while(q2[h2]<i-k+1)                h2++;            if(i>=k)            {                ans1[++cnt]=sa[q1[h1]];                ans2[cnt]=sa[q2[h2]];            }       }       printf("%d",ans1[1]);       for(int i=2;i<=cnt;i++)            printf(" %d",ans1[i]);       printf("\n%d",ans2[1]);       for(int i=2;i<=cnt;i++)            printf(" %d",ans2[i]);       putchar('\n');   }   return 0;}


原创粉丝点击