AcWing 4860. 置换选择
原题链接
简单
作者:
YAX_AC
,
2024-12-12 11:13:27
,
所有人可见
,
阅读 6
#include<bits/stdc++.h>
using namespace std;
/*
我们将获得三个运⾏集:{11,81,94},{12,96,99}和{35}。根据
替代选择算法,我们将读取和排序前3条记录{81,94,11} 并输出11作为最⼩值。然后会有⼀个空间可⽤,
所以读⼊96,它会加⼊第⼀个运⾏集,因为它⼤于11。现在我们有{81,94,96}。81出去后,12进来,但
它必须属于下⼀个运⾏集,因为它⼩于81。因此,我们有{94,96,12},其中12将留在下⼀个运⾏集。当
94出去,99进来,因为99⼤于94,它必须属于第⼀个运⾏集。最终我们将获得两个运⾏集:第⼀个包含
{11,81,94,96,99},第⼆个包含{12,35}。您的任务是实现这个替代选择排序算法。
*/
int n,m,a[100010];
int k,now;
priority_queue<int,vector<int>,greater<int>> q1,q2;//小根堆
int main()
{
cin>>n>>m;
for(int i = 1; i<=n; i++)
{
cin>>a[i];
if(i<=m) q1.push(a[i]);
}
k = m+1;
while(q1.size())
{
int now = q1.top();
cout<<now;
q1.pop();
if(k <= n)
{
if(a[k] < now) q2.push(a[k]);
else q1.push(a[k]);
k++;
}
if(q1.size()) cout<<' ';
else
{
swap(q1,q2);
cout<<endl;
}
}
return 0;
}