- #include<cstdio>
- #include<algorithm>
- #include<iostream>
- #include<set>
- using namespace std;
- typedef pair<int,int> v2;
- typedef pair<int,v2> v3;
- #define r1 first
- #define r2 second.first
- #define r3 second.second
- #define m3(u1,u2,u3) make_pair(u1,make_pair(u2,u3))
- set<v3> h;
- /*
- 之所以用了set而不是priority_queue的原因是……判重
- (似乎从第一列开始,逐渐向右也可以解决判重问题)
- */
- int n;
- int a[100100],b[100100];
- int main(){
- cin>>n;
- for(int i=1;i<=n;++i)cin>>a[i];
- for(int i=1;i<=n;++i)cin>>b[i];
- sort(a+1,a+n+1);
- sort(b+1,b+n+1);
- /*
- a,b从大到小排序
- 我们可以设二维表A[i][j]=a[i]+b[j]
- A是有单调性的,每个元素比上,左小
- 堆中放入最小的A左上角两个节点,可以依次向右、下扩展
- */
- h.insert(m3(a[1]+b[1],1,1));
- for(int i=1;i<=n;++i)
- {
- v3 u=*h.begin(),n1=u,n2=u;
- h.erase(h.begin());
- cout<<u.r1<<" ";
- //每次输出一个最小点,然后把其右边,下面节点放入//
- ++n1.r2;
- n1.r1=a[n1.r2]+b[n1.r3];
- if(n1.r2<=n)h.insert(n1);
- ++n2.r3;
- n2.r1=a[n2.r2]+b[n2.r3];
- if(n2.r3<=n)h.insert(n2);
- }
-
- }