前k大
B . 序列合并 [ 问题 4210 ] [ 讨论 ]
Description
有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2个和,求这N^2个和中最小的N个。
Input
第一行一个正整数NN;
第二行NN个整数AiAi,满足Ai≤Ai+1且Ai≤1e9;
第三行NN个整数BiBi, 满足Bi≤Bi+1且Bi≤1e9.
Output
输出仅一行,包含NN个整数,从小到大输出这N个最小的和,相邻数字之间用空格隔开。
Samples
Hint
对于50%的数据中,满足1≤N≤1000
对于100%的数据中,满足1≤N≤100000
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(); }