序列合并(二叉堆)
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;
}
谢谢
以上是关于序列合并(二叉堆)的主要内容,如果未能解决你的问题,请参考以下文章