10分求助,手写的堆
查看原帖
10分求助,手写的堆
177380
SforyeverQ楼主2023/11/28 22:17
#include<bits/stdc++.h>
using namespace std;
struct priority_queue_private
{
	int head=1;
	long long num[100000];
};
void swap_of_two(long long *A,long long *B)
{
	long long tmp;
	tmp=*A;
	*A=*B;
	*B=tmp;
}
void push_number(priority_queue_private *Q,long long  number)
{
	(*Q).num[(*Q).head]=number;
	(*Q).head+=1;
	int now=(*Q).head-1;
	while(now>1)
	{
		if(now%2==0)
		{
			if((*Q).num[now]<(*Q).num[now/2])
			{
				swap_of_two(&((*Q).num[now]),&((*Q).num[now/2]));
				now=now/2;	
			}
			else break;
		}
		else
		{
			if((*Q).num[now]<(*Q).num[now/2])
			{
				swap_of_two(&((*Q).num[now]),&((*Q).num[now/2]));
				now/=2;
			}
			else break;
		}
	}
}
long long pop_first(priority_queue_private* Q)
{
	long long  num=(*Q).num[1];
	(*Q).head--;
	(*Q).num[1]=(*Q).num[(*Q).head];
	(*Q).num[(*Q).head]=2^31;
	int now=1;
	while(now<(*Q).head)
	{
		if((*Q).num[now*2+1]>(*Q).num[now*2])
		{
			swap_of_two(&((*Q).num[now]),&((*Q).num[now*2]));
			now=now*2;
			continue;
		}
		else
		{
			swap_of_two(&((*Q).num[now]),&((*Q).num[now*2+1]));
			now=now*2+1;
			continue;
		}
	}
	return num;
}
int main()
{
	freopen("1.in","r",stdin);
	priority_queue_private weight;
	int N,num;
	cin>>N;
	memset(weight.num,2^31,sizeof(weight.num));
	for(int i=1;i<=N;i++) 
	{
		cin>>num;
		push_number(&weight,num);
	}
	long long answer=0,newweight;
	
	while(weight.head>2)
	{
		newweight=pop_first(&weight)+pop_first(&weight);
		answer+=newweight;
		push_number(&weight,newweight);
	}
	cout<<answer;
	return 0;	                     
}
2023/11/28 22:17
加载中...