题目链接

题面:

题解:
a序列,b序列都是单调递增的。
维护一个优先队列。
对于b序列的每个值 b [ i ] , 我们维护当前a序列加到第几个了。
如果当前出队的是对于 b [ i ] , 加上的 a [ j ] ,那么我们就再将 b [ i ] + a [ j + 1 ] 压入队列。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#define ll long long
#define llu unsigned ll
#define ld long double
#define iu unsigned int
using namespace std;
const int inf=0x3f3f3f3f;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const double dnf=1e15;
const double eps=1e-8;
const int maxn=100100;
const int mod=20100403;
int a[maxn],b[maxn],cnt[maxn];
priority_queue<pair<int,int> >q;
int main(void)
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
        scanf("%d",&b[i]);
    for(int i=1;i<=n;i++)
    {
        cnt[i]=1;
        q.push(make_pair(-(a[1]+b[i]),i));
    }
    for(int i=1;i<=n;i++)
    {
        printf("%d ",-q.top().first);
        int x=q.top().second;
        q.pop();
        q.push(make_pair(-(a[++cnt[x]]+b[x]),x));
    }
    return 0;
}