poj--1442--black box
2013-02-27 10:21
316 查看
题目大意:有一个黑盒,每次往里面加一个数字,在加到特定数量的数字的时候询问第k小的数字
解题报告:学习了用优先队列来实现一个最大堆和一个最小堆来维护第K小的数字,细节有点麻烦。
参考:点击打开链接
解题报告:学习了用优先队列来实现一个最大堆和一个最小堆来维护第K小的数字,细节有点麻烦。
参考:点击打开链接
#include<iostream> #include<queue> #include<cstdio> #define maxn 30020 #define debug using namespace std; struct maxHeap { int x; maxHeap(int x):x(x) { } bool operator <(const maxHeap & h)const { return x<h.x; } }; struct minHeap { int x; minHeap(int x):x(x) { } bool operator <(const minHeap &h)const{ return x>h.x; } }; priority_queue<minHeap> miq; priority_queue<maxHeap> maq; int n,m; int a[maxn],u[maxn]; int ia,iu,ic; void slove() { iu=0; ic=0; int now=u[iu++]; for(int i=1;i<=n;i++) { if(maq.size()<ic) { maq.push(maxHeap(a[i])); while(maq.size()<ic) { int num=miq.top().x; miq.pop(); maq.push(maxHeap(num)); } } else { if(maq.empty()) { miq.push(minHeap(a[i])); } else { int num=maq.top().x; if(a[i]<num) { maq.pop(); miq.push(minHeap(num)); maq.push(maxHeap(a[i])); } else miq.push(minHeap(a[i])); } } while(i==now&&iu<=m) { int num=miq.top().x; miq.pop(); cout<<num<<endl; ic++; now=u[iu++]; maq.push(maxHeap(num)); } } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=0;i<m;i++) scanf("%d",&u[i]); slove(); return 0; }
相关文章推荐
- poj 1442 Black Box
- POJ Black Box 1442(优先队列)
- poj 1442 Black Box
- Black Box+POJ+treap树模板
- poj 1442 Black Boxes(treap)求第k大数的treap模板
- POJ 1979 Problem:Red and Black(BFS)
- POJ 1442 Black Box [Treap]
- poj 2504 Bounding box
- poj 1979 Red and Black (简单裸搜索)
- Treap模板——POJ1442——Black Box
- POJ 1442 平衡树Treap
- poj 1442 Black Box
- 大(小)顶堆练习:POJ 1442
- POJ 1442-Black Box(优先队列)
- POJ1979-Red and Black
- poj 1442(堆---优先队列)
- poj1979——red and black
- POJ 1979 Red and Black
- DFS:Red and Black(POJ 1979)
- POJ 1442 Black Box【treap模板】