标签:删除 iostream syn step style size void ios wap
其实这个题完全不需要用手写堆,只需要一遍遍sort就行了……
但是!
为了练习手写堆,还是用手写堆做了。
在做本题之前,如果你没有什么思路的话,建议先做Luogu的合并果子。
好,假设你已经做过了合并果子了。那么正式开始本题:
AC代码:
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; long long x,n,tot,dl[100001],sum;//小根堆 char c; void delete_2(long long num) { if(((num<<1)+1)<=tot) { if(dl[num<<1]<dl[(num<<1)+1]) { if(dl[num]<dl[num<<1]) return ; else { swap(dl[num],dl[num<<1]); delete_2(num<<1); } } else { if(dl[num]<dl[(num<<1)+1]) return ; else { swap(dl[num],dl[(num<<1)+1]); delete_2((num<<1)+1); } } } else { if((num<<1)<=tot) { if(dl[num]<dl[num<<1]) return ; else { swap(dl[num],dl[num<<1]); delete_2(num<<1); } } else return ; } return ; } void delete_1()//删除操作 { dl[1]=dl[tot--]; delete_2(1); } void qcr(long long num) //名字随便取的 { if(num==1) return ; if(dl[num]<dl[num>>1]) { swap(dl[num],dl[num>>1]); num>>=1; qcr(num); } return ; } void putin(long long x) //添加操作 { dl[++tot]=x; qcr(tot); } void putout() //读取操作 { printf("%d",dl[1]); return ; } int main() { ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++) { cin>>x; putin(x); } for(int i=1;i<n;i++) { int q,p; q=dl[1]; delete_1(); p=dl[1]; delete_1(); sum+=p+q; putin(p+q); } cout<<sum; return 0; }
标签:删除 iostream syn step style size void ios wap
原文地址:https://www.cnblogs.com/qiuchengrui/p/8995194.html