Pila monotónica
Pila monotónica
Tipo de pregunta común: dada una secuencia, en el lado izquierdo de cada secuencia, donde está el número más cercano más grande o más pequeño que él.
#include <iostream>
#include <vector>
using namespace std;
const int N = 1e5 + 10;
int n;
int stk[N], tt;
int main()
{
cin >> n;
for(int i = 0; i < n; i ++)
{
int x;
cin >> x;
while(tt && stk[tt] >= x) tt--;
if(tt) cout << stk[tt] << ' ';
else cout << -1 << ' ';
stk[++ tt] = x;
}
}
Cola monótona
Use la ventana deslizante para encontrar el valor mínimo en la secuencia
#include <iostream>
#include <vector>
using namespace std;
const int N = 1e5 + 10;
int n;
int a[N], q[N];
int k;
int main()
{
cin >> n >> k;
for(int i = 0; i < n; i ++) cin >> a[i];
int hh = 0, tt = -1;
for(int i = 0; i < n; i ++)
{
//判断队头是否已经滑出窗口
if(hh <= tt && i - k + 1 > q[hh]) hh ++;
while(hh <= tt && a[q[tt]] >= a[i]) tt --;
q[++ tt] = i;
if(i >= k - 1) cout << a[q[hh]] << ' ';
}
cout << endl;
}