题解 | #【模板】堆#

【模板】堆

https://www.nowcoder.com/practice/13f61c8c92404f5ea5d6fa4c692869fb

#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
const int MAXN = 100010;
ll ans[MAXN];
int cnt = 1;

void down(ll* arr, ll mid) {
    ll left = mid * 2 ;
    ll right = mid * 2 + 1 ;
    ll largest = mid;
    if (left < cnt && arr[left] > arr[largest])
        largest = left;
    if (right < cnt && arr[right] > arr[largest])
        largest = right;
    if (largest != mid) {
        swap(arr[largest], arr[mid]);
        down(arr, largest);
    }
}

void Push(ll* arr, ll n) {
    ans[cnt] = n;
    cnt++;
    for(int i = (cnt-1)/2; i>0;i--) down(arr,i);
}

void Top(ll* arr) {
    if (cnt != 1) {
        cout << arr[1] << endl;
        return;
    }
    cout << "empty" << endl;
}

void Pop(ll* arr) {
    if (cnt != 1) {
        cout << arr[1] << endl;
        cnt--;
        arr[1] = arr[cnt];
        down(arr,1);
    } else {
        cout << "empty" << endl;
        return;
    }
}


int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    int n;
    cin >> n;
    string ss;
    ll a;
    while (n--) {
        cin >> ss;
        if (ss == "push") {
            cin >> a;
            Push(ans, a);
        }
        if (ss == "pop") {
            Pop(ans);
        }
        if (ss == "top") {
            Top(ans);
        }
    }
    return 0;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务