博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单调队列 POJ 2823
阅读量:5237 次
发布时间:2019-06-14

本文共 1682 字,大约阅读时间需要 5 分钟。

单调队列如果用2分貌似使时间复杂度增加到O(nlogn)   如果不用二分的单调队列 均摊时间确是O(n)  但是这题用2分优化的版本可以过 谁知道可以用2分优化 均摊时间还是O(n)的算法 可以交流一下

#include <iostream>

#include <algorithm>
#include <vector>
#include <cstdio>
using namespace std;
#define N 1000005
class Elem
{
    public:
    int val;
    int index;
    Elem(int val, int index)
    {
        this->val=val;
        this->index=index;
    }
    Elem() {}
    static bool lesser(const Elem& x, const Elem&y)
    {
        return x.val<y.val;
    }
    static bool greater(const Elem& x, const Elem&y)
    {
        return x.val>y.val;
    }
};
template <class T>
class Queue
{
    public:
        T* array, *head, *tail;
        bool (*compareT)(const T& x, const T&y);
        Queue(T* array, bool (*compareT)(const T& x, const T&y))
        {
            this->array=array;
            head=tail=array;
            this->compareT=compareT;
        }
        void init(T* array, bool (*compareT)(const T& x, const T&y))
        {
            this->array=array;
            head=tail=array;
            this->compareT=compareT;
        }
        void push(const Elem& elem)
        {
            tail=lower_bound(head,tail,elem,compareT);
            *tail=elem; tail++;
        }
        void pop() 
        {
            head++;
        }
};
void output(const Queue<Elem>& q)
{
    Elem* iter;
    for(iter=q.head;iter!=q.tail;iter++)
    {
        printf("[%d,%d] ",iter->val,iter->index);
    }
    printf("\n");
}
int d[N];
Elem elems[N];
int n,k;
int main()
{
    freopen("d.in","r",stdin);
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++) scanf("%d",&d[i]);
    Queue<Elem> q(elems, Elem::lesser);
    for(int i=0;i<n;i++)
    {
        Elem e(d[i],i); 
        q.push(e);
        if(i-q.head->index>=k) q.pop();
        if(i>=k-1) printf("%d ",q.head->val);
        //output(q);
    }
    printf("\n");
    q.init(elems, Elem::greater);
    for(int i=0;i<n;i++)
    {
        Elem e(d[i],i); 
        q.push(e);
        if(i-q.head->index>=k) q.pop();
        if(i>=k-1) printf("%d ",q.head->val);
        //output(q);
    }
    printf("\n");
    return 0;
}

转载于:https://www.cnblogs.com/niuqingpeng/archive/2012/10/16/2725346.html

你可能感兴趣的文章
Fragment
查看>>
比较安全的获取站点更目录
查看>>
苹果开发者账号那些事儿(二)
查看>>
使用C#交互快速生成代码!
查看>>
UVA11374 Airport Express
查看>>
P1373 小a和uim之大逃离 四维dp,维护差值
查看>>
NOIP2015 运输计划 树上差分+树剖
查看>>
P3950 部落冲突 树链剖分
查看>>
读书_2019年
查看>>
读书汇总贴
查看>>
微信小程序 movable-view组件应用:可拖动悬浮框_返回首页
查看>>
MPT树详解
查看>>
空间分析开源库GEOS
查看>>
RQNOJ八月赛
查看>>
前端各种mate积累
查看>>
jQuery 1.7 发布了
查看>>
Python(软件目录结构规范)
查看>>
Windows多线程入门のCreateThread与_beginthreadex本质区别(转)
查看>>
Nginx配置文件(nginx.conf)配置详解1
查看>>
linux php编译安装
查看>>