手打堆0分,可过原题,求改
查看原帖
手打堆0分,可过原题,求改
795990
mushooooooooooooooom楼主2023/7/20 09:24

RT

#include<cstdio>
#include<algorithm>
using namespace std;
long long heap[1000001] {};
int siz=0,now;
void swap(int &x,int &y){int t=x;x=y;y=t;}
void push(int x){//插入
	heap[++siz]=x;
	now=siz;
	//堆底
	while(now){//没到根节点
		long long nxt=now>>1;//找到它的父亲
		if(heap[nxt]>heap[now])swap(heap[nxt],heap[now]);//比它大就交换
		else break;//比它父亲小,插入完成
		now=nxt;//交换
	}
	return;
}
void pop(void){
	swap(heap[1],heap[siz]);
	siz--;
	int now=1;
	while((now<<1)<=siz){
		int nxt=now<<1;//找左儿子
		if(nxt+1<=siz&&heap[nxt+1]<heap[nxt])nxt++;//如果有右儿子并且右儿子比较小
		if(heap[nxt]<heap[now])swap(heap[now],heap[nxt]);//就换
		else break;//否则完成了
		now=nxt;//没完成,继续换
	}
}
long long front(){
	return heap[1];
}
int main(){
	int n,tmp;
	long long ans;
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&tmp);
		push(tmp);
	}
	while(siz!=1){
		int t1=front(),t2;
		pop();
		t2=front();
		pop();
		ans+=t1+t2;
		push(t1+t2);
	}
	printf("%lld\n",ans);
 	return 0;
}
2023/7/20 09:24
加载中...