zoukankan      html  css  js  c++  java
  • AC日记——手写堆ac合并果子(傻子)

    今天整理最近的考试题

    发现一个东西叫做优先队列

    priority_queue(说白了就是大根堆)

    但是

    我对堆的了解还是很少的

    所以

    我决定手写一个堆

    于是我写了一个简单的堆

    手写的堆说白了就是个二叉树

    能不更新维护的二叉树,每次维护的时间为logn

    但是各种查询(empty,top什么的)时间为1;

    感觉这个堆还写的像模像样

    于是兴冲冲的去ac特别简单题合并果子

    没a;

    改了好久才ac

    现在贴一下这个代码

    来,上代码:

    #include<cstdio>
    
    using namespace std;
    
    int heap[200000],num,jkl,cur,n,ans=0;
    
    char ch;
    
    void swap(int &a,int &b)//交换函数
    {
        int t=a;
        a=b,b=t;
    }
    
    void qread(int &x)//读入优化
    {
        x=0,jkl=1;ch=getchar();
        while(ch>'9'||ch<'0'){if(ch=='-') jkl=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+(int)(ch-'0');ch=getchar();}
        x*=jkl;
    }
    
    void heap_up(int now)//向上维护(添加元素时)
    {
        if(now==1) return;
        int cnm=now/2;
        if(heap[cnm]>heap[now])
        {
            swap(heap[cnm],heap[now]);
            heap_up(cnm);
        }
    }
    
    void heap_push(int kol)//添加元素同时维护
    {
        num++;
        heap[num]=kol;
        if(num==1) return ;
        heap_up(num);
    }
    
    void heap_down(int now)//向下维护(删除元素时)
    {
        int l,r;
        if(now*2+1<=num)
        {
            l=now*2,r=now*2+1;
            if(heap[l]<heap[now])
            {
                if(heap[r]<heap[l])
                {
                    swap(heap[r],heap[now]);
                    heap_down(r);
                }
                else
                {
                    swap(heap[l],heap[now]);
                    heap_down(l);
                }
            }
            else
            {
                if(heap[r]<heap[now])
                {
                    swap(heap[r],heap[now]);
                    heap_down(r);
                }
            }
        }
        else
        {
            if(now*2<=num)
            {
                l=now*2;
                if(heap[l]<heap[now]) swap(heap[l],heap[now]);
            }
        }
    }
    
    void heap_pop()//删除元素
    {
        heap[1]=heap[num];
        num--;
        heap_down(1);
    }
    
    int heap_top(){return heap[1];}//查询堆顶元素
    
    bool heap_empty(){return num==0?true:false;}//查询是否为空
    
    int main()
    {
        qread(n);
        for(int i=1;i<=n;i++)
        {
            qread(cur);
            heap_push(cur);
        }
        for(int i=1;i<n;i++)
        {
            cur=heap_top();
            heap_pop();
            cur+=heap_top();
            heap_pop();
            heap_push(cur);
            ans+=cur;
        }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    洛谷 P1144 最短路计数
    浅谈最短路计数问题
    洛谷 P1608 路径统计
    洛谷 P6863 [RC-03] 上下求索
    浅谈差值DP
    洛谷 P1651 塔
    JDOJ 1222: VIJOS-P1037 搭建双塔
    浅谈常见字符串处理函数
    浅谈各种浮点数运算函数
    洛谷 P6859 蝴蝶与花
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6037811.html
Copyright © 2011-2022 走看看