序列合并
P1631 序列合并 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
- 原理:
- a[1]+b[1]<a[1]+b[2]<...<a[1]+b[n]
- a[2]+b[1]<a[2]+b[2]<...<a[2]+b[n]
- ...
- a[n]+b[1]<a[n]+b[n]<...<a[n]+b[n]
- 一共有以上n^2个数字取其中n个
- 首先把第一列的所有入队
- 然后每次输出队首元素,输出后找到输出的那一行将那一行的下一个入队
- 优先队列里的idx记录是哪一行,place记录第i行到了第几列
#include <bits/stdc++.h>
using namespace std;
#define N 1e5
#define INF 2e9
#define MAX 10000000
// 3
// 2 6 6
// 1 4 8
struct Node
{
int sum, idx;
bool operator<(const Node &a) const
{
return sum > a.sum;
}
};
priority_queue<Node> q;
int n, a[MAX], b[MAX], idx[MAX], place[MAX];
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
scanf("%d", a + i);
for (int i = 1; i <= n; i++)
{
scanf("%d", b + i);
q.push(Node{b[1] + a[i], i});
idx[b[1] + a[i]] = i;
}
for (int i = 1, j; i <= n; i++)
{
printf("%d ", q.top().sum);
j = q.top().idx;
q.pop();
place[j]++;
q.push(Node{a[j] + b[place[j] + 1], j});
}
}