序列合并(二叉堆)

Posted SSL_LKJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列合并(二叉堆)相关的知识,希望对你有一定的参考价值。

序列合并

在这里插入图片描述

解题思路

归并排序
比较n个队头
然后可用小根堆优化

AC代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,len,ans,a[100005],b[100005];
struct node
{
	int x,y,sum;
}tree[10000005];
void put(int x,int y)//存储
{
	tree[++len]=(node){x,y,a[x]+b[y]};
	int son=len;
	while(son>1)
	{
		int fa=son/2;
		if(tree[son].sum>=tree[fa].sum)return;
		swap(tree[son],tree[fa]);
		son=fa;
	}
	return;
}
void get()//取值
{
	int x=tree[1].x,y=tree[1].y;
	printf("%d ",tree[1].sum);
	tree[1]=tree[len--];
	int fa=1;
	while(fa*2<=len)
	{
		int son=fa*2;
		if(son+1<=len&&tree[son].sum>tree[son+1].sum)son++;
		if(tree[son].sum>tree[fa].sum)break;
		swap(tree[son],tree[fa]);
		fa=son;
	}
	put(x,y+1);
	return;
}
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]);
	for(int i=1;i<=n;i++)put(i,1);
	for(int i=1;i<=n;i++)get();
	return 0;	
} 

谢谢

以上是关于序列合并(二叉堆)的主要内容,如果未能解决你的问题,请参考以下文章

二叉堆应用

二叉堆练题记录

序列化二叉堆与二叉堆排序

总结二叉堆

左式堆

二叉堆和d-堆的性能比较