|洛谷|NOI導刊|堆|黑匣子_NOI導刊2010提高(06)
阿新 • • 發佈:2019-02-15
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; }