前k大

B . 序列合并 问题 4210  ] 讨论 ]


Description

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

Input

第一行一个正整数NN;

第二行NN个整数AiAi,满足AiAi+1Ai1e9;

第三行NN个整数BiBi, 满足BiBi+1Bi1e9.

Output

输出仅一行,包含NN个整数,从小到大输出这N个最小的和,相邻数字之间用空格隔开。

Samples

Input 复制
3
2 6 6
1 4 8
Output
3 6 7

Hint

对于50%的数据中,满足1N1000

对于100%的数据中,满足1N100000

Source

 

 

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=1e6+100; 
int n;
int a[maxn],b[maxn];
int ans[maxn];
struct node{
    int z1,z2,val;
    bool operator < (const node &a) const{
        return val > a.val;
    }
};
priority_queue<node>q;
void in(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        cin>>b[i];
    }
}
void out(){
    for(int i=1;i<=n;i++){
        printf("%d ",ans[i]);
    } 
}
int main(){
    in();
    for(int i=1;i<=n;i++){
        node S={i,1,a[i]+b[1]};
        q.push(S);
    } 
    for(int i=1;i<=n;i++){
        node tt=q.top(); 
        q.pop();
        ans[i]=tt.val;
        node S={tt.z1,tt.z2+1,a[tt.z1]+b[tt.z2+1]};
        q.push(S);
    }
    out();
}

 

posted @ 2021-05-28 21:06  lipu123  阅读(49)  评论(0)    收藏  举报