本题的数据量很大,显然把N^2个和都放进堆里是会超时的,所以采取的是先将第一行的放入堆,然后每次将取出的数的下一个(如a1-b1取出,将a1-b2弹入),如此往复就能得到答案。我使用的是stl的优先队列,最后两个例子过得时间很慢,可能还有优化吧><
(图片参考洛谷题解@xkyup_king)
#include<cstdio>
#include<queue>
using namespace std;
int a[100005];
int b[100005];
int n;
struct node
{
int na,nb,v;
friend bool operator <(node a,node b)
{
return a.v>b.v;
}
};
priority_queue<node> q;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
scanf("%d",&b[i]);
node p;
for(int i=0;i<n;i++){
p.na=0;
p.nb=i;
p.v=a[0]+b[i];
q.push(p);
}
int t=n;
while(t--){
p=q.top();
printf("%d",p.v);
q.pop();
if(p.na<n-1)
{
p.na+=1;
p.v=a[p.na]+b[p.nb];
q.push(p);
}
if(t!=0) printf(" ");
}
return 0;
}