#include<bits/stdc++.h>
using namespace std;
int n,a[100010],b[100010];
int x=1,y=1,minn;
priority_queue<int> pq; // 使用-号改变小根堆
int main(){
cin >> n;
for(int i=1;i<=n;i++)cin >> a[i];
for(int j=1;j<=n;j++)cin >> b[j];
for(int i=1;i<=n;i++){
for(int j=1;(j)*(i)<=n;j++){
pq.push(-a[i]-b[j]);
}
}
for(int i=1;i<=n;i++){
cout << -pq.top() << " ";
pq.pop();
}
return 0;
}
P1631 序列合并
题解
首先尝试暴力枚举$N^2$次和,并使用优先队列输出,这样显然无法求出。只能拿到50分。
那么对于排序后的$A_i,B_j$,如果$ij>n$那么必然有至少$n$种比$A_i+B_j$小的方案。我们考虑将$ij>n$的情况减去。
时间复杂度$O(n\sqrt{n})$.