题目:
题解:
struct pair {int first, second;
};struct Heap {struct pair* heap;int heapSize;bool (*cmp)(struct pair*, struct pair*);
};void init(struct Heap* obj, int n, bool (*cmp)(struct pair*, struct pair*)) {obj->heap = malloc(sizeof(struct pair) * (n + 1));obj->heapSize = 0;obj->cmp = cmp;
}bool cmp1(struct pair* a, struct pair* b) {return a->second < b->second;
}void swap(struct pair* a, struct pair* b) {struct pair tmp = *a;*a = *b, *b = tmp;
}void push(struct Heap* obj, int x, int y) {int p = ++(obj->heapSize), q = p >> 1;obj->heap[p] = (struct pair){x, y};while (q) {if (!obj->cmp(&(obj->heap[q]), &(obj->heap[p]))) {break;}swap(&(obj->heap[q]), &(obj->heap[p]));p = q, q = p >> 1;}
}void pop(struct Heap* obj) {swap(&(obj->heap[1]), &(obj->heap[(obj->heapSize)--]));int p = 1, q = p << 1;while (q <= obj->heapSize) {if (q + 1 <= obj->heapSize) {if (obj->cmp(&(obj->heap[q]), &(obj->heap[q + 1]))) {q++;}}if (!obj->cmp(&(obj->heap[p]), &(obj->heap[q]))) {break;}swap(&(obj->heap[q]), &(obj->heap[p]));p = q, q = p << 1;}
}struct pair top(struct Heap* obj) {return obj->heap[1];
}bool empty(struct Heap* obj) {return obj->heapSize == 0;
}int cmp(int* a, int* b) {return *a - *b;
}int** getSkyline(int** buildings, int buildingsSize, int* buildingsColSize, int* returnSize, int** returnColumnSizes) {int n = buildingsSize;struct Heap* heap = malloc(sizeof(struct Heap));init(heap, n << 1, cmp1);int boundaries[n << 1];for (int i = 0; i < n; i++) {boundaries[i << 1] = buildings[i][0];boundaries[i << 1 | 1] = buildings[i][1];}qsort(boundaries, n << 1, sizeof(int), cmp);int** ret = malloc(sizeof(int*) * (n << 1));*returnColumnSizes = malloc(sizeof(int) * (n << 1));*returnSize = 0;int idx = 0;for (int i = 0; i < (n << 1); i++) {int boundary = boundaries[i];while (idx < n && buildings[idx][0] <= boundary) {push(heap, buildings[idx][1], buildings[idx][2]);idx++;}while (!empty(heap) && top(heap).first <= boundary) {pop(heap);}int maxn = empty(heap) ? 0 : top(heap).second;if ((*returnSize) == 0 || maxn != ret[(*returnSize) - 1][1]) {int* tmp = malloc(sizeof(int) * 2);tmp[0] = boundary, tmp[1] = maxn;(*returnColumnSizes)[*returnSize] = 2;ret[(*returnSize)++] = tmp;}}return ret;
}