序列合并
题目
解析
这题算是比较裸了,毕竟已经保证了A和B的单调性
暴力插入全部和是O(n2log2n),T(n2)的,在n<=105的数据下直接T飞,我们要考虑奇奇怪怪的优化
发现A和B都保持单调,显然在取出A1+B1前,不需要塞入A1+B2,所以我们可以利用这个性质进行延迟插入,具体实现见代码
code:
#include<cstdio>
#include<queue>
using namespace std;
int n,a[100010],b[100010],len[100010],k;
priority_queue <pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > c;
//小根堆,pair<值,a的下标>
int main()
{
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]),len[i]=1,c.push(pair<int,int>(a[len[i]]+b[i],i));/
//建堆
while(n--)
{
printf("%d ",c.top().first);//每次输出一个
k=c.top().second,c.pop();//取出
c.push(pair<int,int>(a[++len[k]]+b[k],k));//补回
}
return 0;
}