/* poj 1442 题意:给定M个数,每次可以插入序列一个数;再给N个数,表示在插入第几个数时输出一个数, 第一次输出序列中最小的,第二次输出序列中第二小的……以此类推,直到输出N个数。 优先队列的使用: 本题思路是建立一个小顶堆p和一个大顶堆q, q保存前k个小的数,且保证p的值都比q的大, 最后输出q的顶 */ #include <iostream> #include <cstdio> #include <algorithm> #include <queue> using namespace std; int main() { int n,m,i,a[31000]; cin>>m>>n; for(i=0; i<m; i++) scanf("%d",&a[i]); int num=1,b1=0,b2,j=0,s,k=1; priority_queue<int ,vector<int>,greater<int> >p;/*小顶堆,即从小到大*/ priority_queue<int ,vector<int>,less<int> >q; while(n--) { scanf("%d",&b2); while(b1<b2)/*先把数都放在p队列中,是为了维持q队列中的k个数*/ p.push(a[b1++]); while(!q.empty()&&p.top()<q.top()) {/*保证p中的数都比q中的数大,否则交换*/ int x=q.top(); q.pop(); q.push(p.top()); p.pop(); p.push(x); } cout<<p.top()<<endl; q.push(p.top());/*把第k小的数放入q中,保持q的个数*/ p.pop(); } return 0; }
时间: 2024-11-08 22:21:24