1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include <algorithm> #include <cstdio> using namespace std;
int H[10000], heap_size;
void MIN_HEADPIFY(int i) { int l = 2 * i, r = 2 * i + 1, largest = i; if (l <= heap_size && H[l] < H[i]) { largest = l; } if (r <= heap_size && H[r] < H[largest]) { largest = r; } if (largest != i) { swap(H[i], H[largest]); MIN_HEADPIFY(largest); } } int main() { int n, k, tmp; while (~scanf("%d%d", &n, &k)) { heap_size = k; for (int i = 0; i < k; i++) { scanf("%d", &H[i + 1]); } for (int i = k / 2; i >= 1; i--) { MIN_HEADPIFY(i); } for (int i = 0; i < n - k; i++) { scanf("%d", &tmp); if (tmp > H[1]) { H[1] = tmp; MIN_HEADPIFY(1); } } sort(H + 1, H + k + 1); for (int i = k; i > 1; i--) { printf("%d ", H[i]); } printf("%d\n", H[1]); } return 0; }
|