欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

数组模拟堆

时间:2023-04-30

I x,插入一个数 x;
PM,输出当前集合中的最小值;
DM,删除当前集合中的最小值(数据保证此时的最小值唯一);
D k,删除第 k 个插入的数;
C k x,修改第 k 个插入的数,将其变为 x ;

#include#includeusing namespace std;const int N=1e5+5;int n,sz,ct;int h[N],cnt[N],tm[N];void heap_swap(int a,int b){ swap(h[a],h[b]); swap(cnt[tm[a]],cnt[tm[b]]); swap(tm[a],tm[b]);}void down(int k){ int t=k; if(2*t<=sz && h[k]>h[2*t]) k=2*t; if(2*t+1<=sz && h[k]>h[2*t+1]) k=2*t+1; if(t!=k) { heap_swap(t,k); down(k); }}void up(int k){ int t=k; if(t/2>=1 && h[k]>n; while(n--) { string ch; int k,x; cin>>ch; if(ch=="I") { cin>>x; insert(x); } if(ch=="PM") cout<>k; k=cnt[k]; heap_swap(k,sz); sz--; down(k); up(k); } if(ch=="C") { cin>>k>>x; k=cnt[k]; h[k]=x; down(k); up(k); } } return 0;}

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。