您的位置:首页 > 大数据 > 人工智能

MZ Training 2014 #6 D题

2014-10-09 16:09 225 查看
这个题我看到就晓得是要用优先队列来做的。。。好佩服我的感觉



但是还是WA一次,T一次。。。因为其实是要用两个优先队列,一个小——>大(小顶堆),一个大——>小(大顶堆)。

在每次输出操作之前呢,我们把能加入队列的数全部扔进小顶堆;不是要求第i小吗?每次扔数过后,不断地取小顶堆堆顶把大顶堆里的元素补满至i个即可。

!!!注意!每次这里操作后,一定要检查大顶堆堆顶是否比小顶堆堆顶小(要保证大顶堆堆顶就是第i小的数),否则交换入队。

然后输出大顶堆堆顶即可。<span style="color:#3366ff;background-color: rgb(255, 255, 102);">#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
using namespace std;
int n, m, a[30010];
int last,i;
priority_queue<int> daduilie;
priority_queue<int, vector<int>, greater<int> > xiaoduilie;
int main()
{
memset(a,0,sizeof(a));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%d",&a[i]);
last=0;
i=0;
while(m--)
{
i++;
int q;
scanf("%d",&q);
for(int j=++last;j<=q;j++) xiaoduilie.push(a[j]);
while(daduilie.size()<i)
{
daduilie.push(xiaoduilie.top());
xiaoduilie.pop();
}
while(xiaoduilie.size()>0 && daduilie.top()>xiaoduilie.top())
{
int x1=daduilie.top();
daduilie.pop();
int x2=xiaoduilie.top();
xiaoduilie.pop();
xiaoduilie.push(x1);
daduilie.push(x2);
}
printf("%d\n",daduilie.top());
last=q;
}
return 0;
}</span>秦导师是哲学家啊~~~  ~~(≧▽≦)/~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  队列 第k极值