1. 程式人生 > >|洛谷|NOI導刊|堆|黑匣子_NOI導刊2010提高(06)

|洛谷|NOI導刊|堆|黑匣子_NOI導刊2010提高(06)

http://www.luogu.org/problem/show?pid=1801

開兩個堆,一個大根堆維護1~i-1小元素,一個小根堆維護i~n小元素

新增元素時,如果元素小於大根堆堆頂,那麼把大根堆堆頂出堆,將此元素加入大根堆

否則將元素加入小根堆

查詢值即為小根堆頂,查詢完後將小根堆頂加入大根堆

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define ms(i,j) memset(i,j, sizeof i);
using namespace std;
int A[200005];
priority_queue<int> q1;
priority_queue<int, vector<int>, greater<int> > q2;
int main()
{
	int m,n;
	scanf("%d%d", &m, &n);
	for (int i=1;i<=m;i++) scanf("%d", &A[i]);
	int v = 1;
	for (int i=1;i<=n;i++)
	{
		int u;
		scanf("%d", &u); 
		for (;v<=u;v++)
		{
			if (!q1.empty()) 
			{
				if (A[v]<q1.top())
				{
					q2.push(q1.top());
					q1.pop();
					q1.push(A[v]);
				} else q2.push(A[v]);
			} else q2.push(A[v]);
		}
		printf("%d\n", q2.top());
		q1.push(q2.top()); q2.pop();
	}
    return 0;
}