参照别人的思路自己写的代码。(代码量很大也不够优化。)
#include <iostream>
#include <cstring>
using namespace std;
const int inf=1e5+10;
int arr1[inf],arr2[inf],ans[inf];
int n; //使用结构体。
struct node
{
int a;
int b;
};
node temp[inf];
void bigstack(int i) //小根堆。i是第i个。
{
while(i!=1)
{
if(temp[i].a<temp[i/2].a)
swap(temp[i],temp[i/2]);
else
break;
i=i/2;
}
}
void stacksort()
{
int i=1;
while(i*2+1 <=n ) //这里是关键,只能够进行考虑最后一个。也是不同的。完全是可以进行改进的。
{
if(temp[i*2+1].a<temp[i*2].a&&temp[i].a>=temp[i*2+1].a)
{
swap(temp[i],temp[i*2+1]);
i=i*2+1;
}
else if(temp[i*2].a<=temp[i*2+1].a&&temp[i].a>=temp[i*2].a)
{
swap(temp[i],temp[i*2]);
i=i*2;
}
else //分布,先是从两个进行考虑,之后在加条件罢了。
break;
}
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
scanf("%d",&arr1[i]);
for(int i=1;i<=n;i++)
scanf("%d",&arr2[i]);
for(int i=1;i<=n;i++)
{
temp[i].a=arr1[i]+arr2[1];
temp[i].b=i;
}
for(int i=2;i<=n;i++)
bigstack(i); ///调用函数。
//之后。
int flag[inf]; //flag[i]代表的是第i个的指向。
for(int i=1;i<=n;i++)
flag[i]=1; //指向的是第一个。
//因为是任意的一个是不好进行判定的,所以只能是结构体,结束的时候在看一下。
for(int i=1;i<=n;i++) //但是也是要进行记录的。看来要是结构体。
{
ans[i]=temp[1].a; //就是寻找最为简单的一条路,时空效率最为简单的一条路,并且要代码量也是要最少的。
flag[temp[1].b]++; //值是第几个,代表的死arr2【】,temp【i】.b应该是第几个的角标吧。
temp[1].a = arr1[ temp[1].b ]+arr2[ flag[temp[1].b] ];
stacksort();
}
cout<<ans[1];
for(int i=2;i<=n;i++)
cout<<" "<<ans[i];
cout<<endl;
}
return 0;
}