P1631 序列合并[优先队列]

发布时间 2023-08-11 20:21:10作者: qbning

P1631 序列合并

这个没做出来属实有些惭愧。看了题解觉得很妙。如果直接想的话可能反而很麻烦

题目是给两个n个数的不下降序列,问这两个序列任意各取出一个后相加的最小的n个数是什么。

直接贴题解吧题解 P1631 【序列合并】

一共会产生n*n个数,

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[2]........<=a[n]+b[n]

先把这前n个第一个数放入优先队列,最小的加入答案然后把它的下一个放入优先队列即可

查看代码

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
ll n,a[100005],b[100005],q[100005];
priority_queue<pair<int,int>, vector<pair<int,int> >,greater<pair<int, int> > >cc;
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int j=1;j<=n;j++)
	{
		cin>>b[j];
		q[j]++;
		cc.push(pair<int,int>(a[1]+b[j],j));
	}
	while(n--)
	{
		auto cx=cc.top();
		cc.pop();
		cout<<cx.first<<' ';
		cc.push(pair<int,int>(b[cx.second]+a[++q[cx.second]],cx.second));
	}
	return 0;
}