P1631 序列合并

P1631 序列合并

有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2N2个和,求这N^2N2个和中最小的N个。

 对于100%的数据中,满足1<=N<=100000。

  • 思路巧妙,直接看代码
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;

#define res register int

inline int read()
{
	int x=0,f=1;char ch;
	while(!isdigit(ch=getchar())) if(ch=='-') f=-1;
	while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
	return f*x;
}
const int N=100000+10;
int n,m;
int a[N],b[N];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
int cnt[N];

int main()
{
	n=read(); 
	for(res i=1 ; i<=n ; ++i) a[i]=read(); 
	for(res j=1 ; j<=n ; ++j)
	{
		b[j]=read(); cnt[j]=1;
		q.push(make_pair(a[1]+b[j],j));	
	} 
//	sort(a+1,a+n+1); sort(b+1,b+n+1);
	for(res i=1 ; i<=n ; ++i)
	{
		pair<int,int> x=q.top(); q.pop();
		printf("%d ",x.first);
		int id=x.second; 
		q.push(make_pair(a[++cnt[id]]+b[id],id));
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/wmq12138/p/10507546.html