zoukankan      html  css  js  c++  java
  • 堆模板

    【emmm】

        堆其实就是一个完全二叉树:叶子节点都在最后两层且集中在左侧。大(小)根堆的定义就是:每一个节点的权值大于等于(小于等于)其左右儿子(若存在)。

        支持的操作有:

            插入

            删除(根节点或者非根节点)

            查询根的权值

    【代码】

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int heap[100010],tot;
     4 void up(int p)
     5 {
     6     while(p>1)
     7         if(heap[p]>heap[p/2]) 
     8             swap(heap[p],heap[p/2]), p/=2;
     9         else break;
    10 }
    11 void Insert(int val)
    12 {
    13     heap[++tot]=val;
    14     up(tot);
    15 }
    16 void down(int p)
    17 {
    18     int s=p*2;
    19     while(s<=tot) {
    20         if(s<tot&&heap[s]<heap[s+1]) s++;
    21         if(heap[s]>heap[p]) swap(heap[s],heap[p]),p=s,s*=2;
    22         else break;
    23     }
    24 }
    25 void Extract()
    26 {
    27     heap[1]=heap[n--];
    28     down(1);
    29 }
    30 void Remove(int p)
    31 {
    32     heap[p]=heap[n--];
    33     up(p),down[p];
    34 }
  • 相关阅读:
    [CF786B] Legacy
    [CF833B] The Bakery
    [JSOI2008] 最小生成树计数
    [SDOI2010] 外星千足虫
    [POJ1830] 开关问题
    [Luogu1365] WJMZBMR打osu! / Easy
    [Noip2016] 换教室
    [NOI2002] 荒岛野人
    [计蒜之道复赛 2018] 贝壳找房计数比赛
    [SDOI2014] 旅行
  • 原文地址:https://www.cnblogs.com/Willendless/p/9416242.html
Copyright © 2011-2022 走看看