手打小根堆55pts求助
查看原帖
手打小根堆55pts求助
277757
hanyuchen2019楼主2021/9/24 20:58
#include<iostream>
#include<algorithm>
using namespace std;
int k[100005],siz;
int main()
{
	ios::sync_with_stdio(false);
	int n,m,now;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>k[++siz];
		now=siz;
		while(k[now]<k[now/2])swap(k[now],k[now/2]),now/=2;
	}
	for(int i=1;i<=m&&siz;i++)
	{
		cout<<k[1]<<endl;
		k[1]=k[siz--];
		now=1;
		while(1)
		{
			if(now*2+1>siz||k[now]<k[now*2]&&k[now]<k[now*2+1])
				break;
			if(k[now*2]>k[now*2+1])
				swap(k[now],k[now*2+1]),now=now*2+1;
			else
				swap(k[now],k[now*2]),now*=2;
		}
	}
 	return 0;
}

谢谢

2021/9/24 20:58
加载中...