zoukankan      html  css  js  c++  java
  • 堆(优先队列)模板

    包含向上、向下两种维护方向,方便手动维护堆中单个元素(STL的priority_queue和make_heap没有这种功能T_T)

    namespace heap{
        #define p(x) ((x) >> 1)
        #define l(x) ((x) << 1)
        #define r(x) (((x) << 1) + 1)
        #define maxn ((int)1e5)
        template <typename T>
            struct heap{
                T heap[maxn];
                int size;
                bool (*cmp)(T &a, T &b);
                void swap(T &a,T &b){T t = a;a = b;b = t;}
                bool Cmp(T &a, T &b){return a < b;}
                heap(){size = 0;cmp = Cmp;}
                heap(bool(*C)(T &a, T &b)){//参数为比较函数cmp的指针
                    size = 0;
                    cmp = C;
                }
                heap(T *begin, T *end){
                    size = end - begin;
                    int i = 0;
                    for(;i < size;++i)
                        heap[i+1] = *(begin + i);
                    for(i = size;i;--i)
                        maintainup(i);
                }
                void maintaindown(int k){
                    int M = k;
                    bool ctn;
                    while(l(k) < size){
                        ctn = 0;
                        if(cmp(heap[l(k)], heap[M]))M = l(k);
                        if(r(k) < size && cmp(heap[r(k)],heap[M]))M = r(k);
                        if(k != M)swap(M, k), ctn = 1, k = M;
                        if(!ctn)return;
                    }
                }
                void maintainup(int k){
                    while(p(k) && cmp(heap[k], heap[p(k)]))
                        swap(heap[k], heap[p(k)]), k = p(k);
                }
                void insert(int k){
                    heap[++size] = k;
                    maintainup(k);
                }
                void pop(int k){
                    heap[k] = heap[size--];
                    if(cmp(heap[p(k)],heap[k])maintaindown(k);
                    else maintainup(k);
                }
            };
    }//namespce heap
  • 相关阅读:
    Linux内核将要支持最新龙芯3A2000/3B2000
    微软拥抱Linux,着实太晚了
    武校学生
    第一篇 SCI 综述被接收的感想
    如何使用Rally+Docker测试OpenStack
    (OK) ntp——linux设置系统时间—RHEL—FEDORA—CENTOS
    理解 Linux 网络栈(2):非虚拟化Linux 环境中的 Segmentation Offloading 技术
    (OK) find-alter-files.sh——递归
    (OK) digui-gb18030-utf8.sh——递归
    (OK) digui-dir-del-M.sh——递归
  • 原文地址:https://www.cnblogs.com/Asm-Definer/p/4008005.html
Copyright © 2011-2022 走看看