P1631&&ybtoj【数据结构】1章2题【序列合并】

序列合并

题目

P1631


解析

这题算是比较裸了,毕竟已经保证了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;
}

猜你喜欢

转载自blog.csdn.net/zhanglili1597895/article/details/115253452