其他分享
首页 > 其他分享> > POJ 2823

POJ 2823

作者:互联网

  单调队列

#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN=1000000+10;
int n,k,maxh,minh,maxt,mint; 
int maxq[MAXN],minq[MAXN],num[MAXN];//maxq记录的是位置而不是大小、sum数组是不变的d 
int maxans[MAXN],minans[MAXN];

int main()
{
    while (scanf("%d%d",&n,&k)!=EOF)
    {
        int maxhead=0,minhead=0,maxtail=0,mintail=0;
        for (int i=0;i<n;i++)
        {
            if (maxhead<maxtail && maxq[maxhead]<=i-k) //第一个是队列里还没有的 时候不执行  第二个是还没有达到k不执行 
            {
                maxhead++;  //代表窗口向右移动一位置 
            }                         
            scanf("%d",&num[i]);
            while (maxhead<maxtail && num[maxq[maxtail-1]]<=num[i])//第一个上同,第二个是当前的数加入队列的时候该队列是不是单调递减的 
            {
                maxtail--;
            } 
            maxq[maxtail]=i;
            maxtail++;
            
            
            maxans[i]=num[maxq[maxhead]];
                     
        }
        
        for (int i=k-1;i<n;i++)
        cout<<maxans[i]<<' ';cout<<endl;
    }
    return 0;
}

 

标签:minh,EOF,int,maxq,MAXN,POJ,include,2823
来源: https://www.cnblogs.com/jrfr/p/10485982.html