c_cpp 堆。空手。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 堆。空手。相关的知识,希望对你有一定的参考价值。

#include<cstdio>
#include<utility>
#include<algorithm>
using namespace std;

struct P { int d; int s; int p; };

int n;
P x[1000020];
P* y[1000020];

void myswap(P*& a, P*& b) {
    swap(a->p, b->p);
    swap(a, b);
}

bool lt(int i, int j) {
    if (y[i]->s < y[j]->s) return true;
    else if (y[i]->s != y[j]->s) return false;
    return y[i]->d > y[j]->d;
}

void up(int idx) {
    while (idx / 2 > 0 && lt(idx / 2, idx)) {
        myswap(y[idx / 2], y[idx]);
        idx /= 2;
    }
}

void down() {
    int idx = 1;
    while (idx * 2 + 1 <= n) {
        if (lt(idx, idx * 2) && lt(idx * 2 + 1, idx * 2)) {
            myswap(y[idx], y[idx * 2]);
            idx = idx * 2;
        } else if (lt(idx, idx * 2 + 1)) {
            myswap(y[idx], y[idx * 2 + 1]);
            idx = idx * 2 + 1;
        } else break;
    }
    if (idx * 2 == n && lt(idx, idx * 2))
        myswap(y[idx], y[idx * 2]);
}

int main() {
    int q, h, p;
    scanf("%d%d", &n, &q);

    for (int i = 1; i <= n; i++) {
        x[i].d = i;
        x[i].p = i;
        x[i].s = 0;
        y[i] = &x[i];
    }

    while (q--) {
        scanf("%d", &h);
        if (h == 1) {
            scanf("%d%d", &h, &p);
            x[h].s += p;
            up(x[h].p);
        } else {
            scanf("%d", &h);
            y[1]->s -= h;
            down();
        }
    }

    for (int i = 1; i <= n; i++)
        printf("%d\n", x[i].s);
}

以上是关于c_cpp 堆。空手。的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 堆

c_cpp 堆

c_cpp 堆排序

c_cpp 嵌套一堆托架

c_cpp 使用宏来连接堆对象

身摸是空手道