Título
O ZJM possui uma sequência de comprimento n e uma janela do tamanho k.A janela pode se mover para frente e para trás na sequência.Agora, o ZJM deseja saber quando a janela desliza da esquerda para a direita, os valores máximo e mínimo do número na janela a cada vez. Quanto.
Entrada
Existem duas linhas de entrada. Os dois números inteiros n e k na primeira linha representam o comprimento da sequência e o tamanho da janela deslizante, 1 <= k <= n <= 1000000. Na segunda linha, existem n números inteiros representando a sequência de ZJM.
Resultado
A saída tem duas linhas. A primeira linha gera o valor mínimo da janela deslizante em cada posição, da esquerda para a direita. A segunda linha é o valor máximo.
Entrada de amostra
8 3
1 3 -1 -3 5 3 6 7
Saída de amostra
1 -3 -3 -3 3 3
3 3 5 5 6 7
Idéias
Use filas monótonas.
O processo de manutenção de uma fila monotônica é semelhante à pilha monotônica, exceto que:
- A pilha monotônica mantém apenas uma extremidade (parte superior da pilha), enquanto a fila monótona pode manter ambas as extremidades (primeira e última)
- As pilhas monotônicas geralmente mantêm a monotonicidade global, enquanto as filas monotônicas geralmente mantêm a monotonicidade local.O tamanho da pilha monotônica não tem limite superior, enquanto as filas monotônicas geralmente têm limites de tamanho
Use a fila monotonicamente decrescente para encontrar o valor máximo na janela e use a fila monotonicamente crescente para encontrar o valor mínimo na janela.
Ao fazer o loop pela i-ésima vez, o chefe da equipe é o resultado do processamento dos primeiros k elementos, ou seja, o menor / maior dos primeiros k elementos.
Código
#include <cstdio>
#include <queue>
using namespace std;
int a[1000005];
deque<int> q;
int main() {
int n,k;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++){
while (q.size()>0&&q.front()<i-k+1)
q.pop_front();
while (q.size()>0&&a[q.back()]>a[i])
q.pop_back();
q.push_back(i);
if(i>=k-1)
printf("%d ",a[q.front()]);
}
q.clear();
printf("\n");
for(int i=0;i<n;i++){
while(q.size()>0&&q.front()<i-k+1)
q.pop_front();
while(q.size()>0&&a[q.back()]<a[i])
q.pop_back();
q.push_back(i);
if(i>=k-1)
printf("%d ",a[q.front()]);
}
return 0;
}