手写堆,蒟蒻10分求调
查看原帖
手写堆,蒟蒻10分求调
1071516
isop楼主2024/5/11 08:27
#include<bits/stdc++.h>
using namespace std;

const int maxn=1e5+5;
int a[maxn];
int len;

inline int read()
{
	int a=0,f=1;
	char c=getchar();
	while(!isdigit(c))
	{
		if(c=='-') f=-1;
		c=getchar();
	}
	while(isdigit(c))
	{
		a=(a<<1)+(a<<3)+(c^'0');
		c=getchar();
	}
	return a*f;
}

/*
void order()
{
	cout<<"order   ";
	for(int i=1;i<=len;i++)
		cout<<a[i]<<" ";
	cout<<endl;
}
*/

void adjust(int index)//index非叶子节点的下标 
{
	int left=2*index,right=2*index+1;
	int minidx=index;
	if(left<=len && a[left]<a[minidx]) minidx=left;
	if(right<=len && a[right]<a[minidx]) minidx=right;//找左右子节点中较小者 
//	cout<<minidx<<"x"<<endl;
	if(minidx!=index)
	{
//		cout<<minidx<<endl; 
		swap(a[minidx],a[index]);
		adjust(minidx);//从子节点继续 
	}
} 

void push(int x)
{
	a[len++]=x;
	int index=len;//当前节点 
	while(a[index]<a[index/2])
	{
		swap(a[index],a[index/2]);
		index/=2;
	}
}

int pop()
{
	int t=a[1];
//	cout<<a[1]<<" "<<a[len]<<endl;
	a[1]=a[len];
	len--;
//	order();
	adjust(1);
//	order();
	return t;
}

void heapsort()
{
	//构建小根堆 
	for(int i=len/2;i>=0;i--)//从最后一个非叶子节点开始 
	{
		adjust(i);
	}
}


int main()
{
	len=read();
	for(int i=1;i<=len;i++)//序号从1开始 
		a[i]=read();
	heapsort();
//	order();
	int ans=0;
	while(1)
	{
		int tmp=pop();
		tmp+=pop();
		ans+=tmp;
		if(!len) break;//空
		push(tmp); 
	}
	cout<<ans<<endl;
}
2024/5/11 08:27
加载中...