用二叉堆做的
by 高清重置版hy @ 2017-08-03 15:25:46
#上面没注释,再发一遍
```cpp
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
long long n,a[1000000+100],k,m,j,ans=0,lin=0;
cin>>n;
cin>>a[1];
for(int i=2;i<=n;i++){
cin>>a[i];
j=i;
while(a[j]<a[j/2]&&j>1){
int tmp=a[j];
a[j]=a[j/2];
a[j/2]=tmp;
j/=2;//输入,排序
}
}
int v=n;lin=a[1];
for(int q=1;q<=n-1;q++){
a[1]=lin;
while(a[q]<a[q/2]&&q>1){
int tmp=a[q];
a[q]=a[q/2];
a[q/2]=tmp;
q/=2;//每次合并后重新排序
}
k=1;
a[1]=a[v--];
while((a[k]>a[2*k]&&k*2<=v)||(a[k]>a[k*2+1]&&k*2+1<=v)){
m=k*2;
if(a[m]>a[m+1]&&m+1<=v)m++;
int temp=a[k];
a[k]=a[m];
a[m]=temp;
k=m;
}lin+=a[1];
ans+=lin;//删掉一个儿子
} cout<<ans;
return 0;
}
```
by 高清重置版hy @ 2017-08-03 15:30:32
@lxyhhhhhh
by 高清重置版hy @ 2017-08-03 15:37:37
学习优先队列,拯救你于水火之中(滑稽)
by Jacob233 @ 2017-08-03 15:55:46
去学优先队列吧(doge 手打堆累死(#雾
by VenusM1nT @ 2017-08-06 09:52:28