题目很难理解:向一个容器中不断的添加n个数,然后有一系列查询,每次查询第i小的数并进行输出.
刚开始就一个最小堆,果断超时了。
后来,搜了报告,原来,是用最大与最小堆之间动态维护。保证前i小个数一定留在max堆里。
话说,stl是好东西,代码简洁。但比手动的慢。优缺点同样明显。
http://archive.cnblogs.com/a/1900652/-------->手动维护堆!
#include<iostream> #include<cstdio> #include<queue> using namespace std; #define maxn 30003 int A[maxn],u[maxn]; priority_queue<int ,vector<int >,greater<int >>minheap; priority_queue<int ,vector<int >,less<int >>maxheap; int main() { int i,j; int m,n,flag; cin>>m>>n; for(i=1;i<=m;i++) scanf("%d",&A[i]); for(i=1;i<=n;i++) scanf("%d",&u[i]); j=1;u[0]=0;int k; for(i=1;i<=n;i++) { while(j<=u[i]) { maxheap.push (A[j]); j++; } for(k=u[i]-u[i-1];k>0;k--) { minheap.push (maxheap.top ()); maxheap.pop (); } printf("%d\n",minheap.top ()); maxheap.push (minheap.top ()); minheap.pop (); } return 0; }