P1631 序列合并
这道题和后面一道题是孪生兄弟。。。
给你两组单调递增的序列,可以拿里面的元素相互相加,要你求出第1至第\(m\)小的值。
同样是那样的思路,用堆。
设\(y = a_i+b_i\),那么就同样有\(n\)个元素了。
这里固定b的下标先不定,向堆里面添加\(a_i+b_1\)。
然后执行\(m\)次出队,每次出队补充另一个进来。
顺序输出就可以了,没什么好说的。。。
代码:
#include<cstdio>
#include<queue>
const int maxn = 100005;
struct Nodes
{
int val, ai, bi;
bool operator < (const Nodes &rhs) const
{
return val > rhs.val;
}
};
std::priority_queue<Nodes> q;
int a[maxn], b[maxn];
int n;
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i++) scanf("%d", &b[i]);
for(int i = 1; i <= n; i++) q.push((Nodes){a[i] + b[1], i, 1});
for(int i = 1; i <= n; i++)
{
Nodes temp = q.top(); q.pop();
printf("%d", temp.val);
q.push((Nodes){a[temp.ai] + b[temp.bi + 1], temp.ai, temp.bi + 1});
if(i != n) printf(" ");
}
printf("\n");
return 0;
}