题目链接:http://poj.org/problem?id=1442
本来想复制一下,然后直接sort,结果T了。
在网上看了一下,有用两个队列做的,想了半天,没看懂什么意思。后来模拟一边,总算是懂了。
这里,将要输出的第k小的数存在最小堆中,输出,压入到最大堆中(最大堆是用来存第k小之前的数,更小),循环操作中,要是发现,压人到最小堆中的数,要是比最大堆中的头结点要小,当然要交换啦。
#include <stdio.h> #include <string.h> #include <queue> using namespace std; const int maxn = 30005; int a[maxn]; int main() { int m,n; priority_queue<int ,vector<int>,less<int> >Q; ///最大堆 priority_queue<int ,vector<int>,greater<int> > QQ; ///最小堆 scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) scanf("%d",&a[i]); int be = 1; for(int i=1;i<=n;i++) { int b; scanf("%d",&b); for(int j=be;j<=b;j++) { QQ.push(a[j]); if(!Q.empty()&&Q.top()>QQ.top()) { int tmp; tmp = Q.top(); Q.pop(); Q.push(QQ.top()); QQ.pop(); QQ.push(tmp); } } be=b+1; printf("%d ",QQ.top()); Q.push(QQ.top()); QQ.pop(); } return 0; }