Un tema algo interesante.
Podemos mantener dos colas de prioridad: pqmin y pqmax,
donde pqmin es el montón raíz pequeño y pqmax es el montón raíz grande.
Cada vez que agrega un número, el número se inserta en pqmin
cada vez que obtiene, desde el montón de pqmin Saca un número y dale salida, y luego inserta este número en pqmax.Mantenga
que cada elemento en pqmax es menor o igual que pqmin, es decir, después de que cada elemento se inserta en pqmin, compare los elementos superiores de pqmax y pqmin. Si el elemento superior del montón pqmax es mayor que el elemento superior del montón pqmin, el elemento en la parte superior del montón pqmin se inserta en pqmax y el elemento en la parte superior del montón pqmax se inserta en pqmin.
Mantener el número de elementos en pqmax es constante en i,
entonces el elemento i-ésimo + 1 valor mínimo debe ser el máximo de pqmin
Código de CA (tenga en cuenta que juzgué si las condiciones anteriores no se cumplen antes de presionar pqmin y lo presioné en pqmax por adelantado)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200010;
int lists[MAXN];
priority_queue<int, vector<int>, greater<int>> pqmin;
priority_queue<int> pqmax;
int main()
{
#ifdef ACM_LOCAL
freopen("./in.txt", "r", stdin);
freopen("./out.txt", "w", stdout);
#endif
ios::sync_with_stdio(false);
int m, n;
cin >> m >> n;
for (int i = 0; i < m; i++)
{
cin >> lists[i];
}
int cur = 0;
for (int i = 0; i < n; i++)
{
int temp;
cin >> temp;
while (cur < temp)
{
if (!pqmax.empty() && lists[cur] < pqmax.top())
{
pqmin.push(pqmax.top());
pqmax.pop();
pqmax.push(lists[cur]);
}
else
{
pqmin.push(lists[cur]);
}
cur++;
}
cout << pqmin.top() << endl;
pqmax.push(pqmin.top());
pqmin.pop();
}
return 0;
}