codeup 问题 B 序列合并
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cassert>
using namespace std;
#define MAXN (100000+5)
int N;
struct Heap {
int heap[MAXN];
int N;
void DownAdjust(int low, int hi) {
int i=low;
int j=2*i;
while (j<=hi) {
if (j+1<=hi && heap[j+1]>heap[j]) {
j++;
}
if (heap[j] > heap[i]) {
swap(heap[j], heap[i]);
i=j;
j=2*i;
} else {
break;
}
}
}
void CreateHeap() {
for (int i=N/2;i>=1;--i) {
DownAdjust(i, N);
}
}
int Top() {
return heap[1];
}
void DeleteTop() {
heap[1]=heap[N--];
DownAdjust(1, N);
}
void UpAdjust(int low, int hi) {
int i=hi;
int j=i/2;
while (j>=low) {
if (heap[i] > heap[j]) {
swap(heap[i], heap[j]);
i=j;
j=i/2;
} else {
break;
}
}
}
void Insert(int x) {
heap[++N]=x;
UpAdjust(1, N);
}
void Init() {
N=0;
}
void Sort() {
for (int i=N;i>1;i--) {
swap(heap[1], heap[i]);
DownAdjust(1, i-1);
}
}
void Print() {
for (int i=1;i<=N;++i) {
printf("%d%s", heap[i], i==N?"\n":" ");
}
}
};
Heap heap;
int A[MAXN], B[MAXN];
int main(int argc, char** argv) {
while (scanf("%d", &N) != EOF) {
heap.Init();
for (int i=1;i<=N;++i) {
scanf("%d", &A[i]);
}
for (int i=1;i<=N;++i) {
scanf("%d", &B[i]);
heap.Insert(A[1] + B[i]);
}
for (int i=2;i<=N;++i) {
for (int j=1;j<=N;++j) {
int top=heap.Top();
int now=A[i]+B[j];
if (now < top) {
heap.DeleteTop();
heap.Insert(now);
} else {
break;
}
}
}
heap.Sort();
heap.Print();
}
return 0;
}