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 使用宏来连接堆对象
身摸是空手道