zoukankan      html  css  js  c++  java
  • [hihoCoder] 题外话·堆

    A direct applicatin of the heap data structure. Specifically, a max heap is used. The required functions include insertion of a node to the heap and extraction of the maximum element of the heap. Each time you insert or remove an element to or from the heap, you need to maintain the max heap property.

    The code is as follows.

    If you want to learn more about heap, you may refer to this passage.

     1 #include <iostream>
     2 #include <vector>
     3 
     4 using namespace std;
     5 
     6 class Heap {
     7 public:
     8     Heap() {
     9         data.clear();
    10     }
    11 
    12     inline int parent(int idx) {
    13         return (idx - 1) >> 1;
    14     }
    15 
    16     inline int left(int idx) {
    17         return (idx << 1) + 1;
    18     }
    19 
    20     inline int right(int idx) {
    21         return (idx << 1) + 2;
    22     }
    23 
    24     void max_heapify(int idx) {
    25         int largest = idx;
    26         int l = left(idx), r = right(idx);
    27         if (l < (int)data.size() && data[l] > data[largest]) largest = l;
    28         if (r < (int)data.size() && data[r] > data[largest]) largest = r;
    29         if (largest != idx) {
    30             swap(data[idx], data[largest]);
    31             max_heapify(largest);
    32         }
    33     }
    34 
    35     void insert(int elem) {
    36         data.push_back(elem);
    37         int idx = data.size() - 1;
    38         while (idx >= 0 && parent(idx) >= 0 && data[parent(idx)] < data[idx]) {
    39             swap(data[parent(idx)], data[idx]);
    40             idx = parent(idx);
    41         }
    42     }
    43 
    44     int extract_max(void) {
    45         int maximum = data[0];
    46         swap(data[0], data[data.size() - 1]);
    47         data.erase(data.end() - 1, data.end());
    48         max_heapify(0);
    49         return maximum;
    50     }
    51 
    52 private:
    53     vector<int> data;
    54 };
    55 
    56 int main(void) {
    57     int events;
    58     while (scanf("%d", &events) != EOF) {
    59         Heap sugars;
    60         for (int i = 0; i < events; i++) {
    61             char order[2];
    62             scanf("%s", order);
    63             if (order[0] == 'A') {
    64                 int sugar;
    65                 scanf("%d", &sugar);
    66                 sugars.insert(sugar);
    67             }
    68             else printf("%d
    ", sugars.extract_max());
    69         }
    70     }
    71     return 0;
    72 }
  • 相关阅读:
    组件ListWidget 继承StatefulWidget后动态传入List数据,组件并不会重新渲染。
    Spring Security 采用httpBasic模式认证
    基于Vue2.0实现OpenLayers MarkerCluster海量聚合点标记
    Spring Security 采用formLogin模式认证
    配置页面兼容360浏览器
    如何进行企业工作流选型
    IT项目管理的六种错误思维
    时间管理10项技巧
    一个项目涉及到的50个Sql语句(下)
    SQL Server2000存储过程调试
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4558659.html
Copyright © 2011-2022 走看看