SEMANA 5 D ventana corredera

Titulo:

ZJM tiene una secuencia de longitud n y una ventana de tamaño K. La ventana puede moverse hacia adelante y hacia atrás en la secuencia. Ahora ZJM quiere saber cuándo la ventana se desliza de izquierda a derecha, los valores máximos y mínimos del número en la ventana cada vez Cuánto. Por ejemplo:
Inserte la descripción de la imagen aquí

Entrada

Hay dos líneas de entrada. Los dos enteros n y k en la primera fila representan la longitud de la secuencia y el tamaño de la ventana deslizante, 1 <= k <= n <= 1000000. En la segunda fila, hay n enteros que representan la secuencia de ZJM.

Salida

La salida tiene dos líneas. La primera línea muestra el valor mínimo de la ventana deslizante en cada posición de izquierda a derecha. La segunda línea es el valor máximo.

Entrada de muestra

8 3
1 3 -1 -3 5 3 6 7

Salida de muestra

1-3-3-3 3 3
3 3 5 5 6 7

Ideas

Aquí está el valor máximo en la ventana deslizante de tamaño k. Para i, se requieren los valores máximo y mínimo del intervalo [i-k + 1, i]. Por lo tanto, para elementos que no están en el rango actual, Eliminación, es decir, el elemento head, por lo que es más apropiado usar la estructura de cola aquí.
Cree una cola monotónicamente creciente y presione cada número sucesivamente. Si el número que se va a empujar no satisface la monotonicidad de la cola, el elemento al final de la cola se eliminará hasta que el elemento que se va a empujar no afecte a la monotonicidad. Después de presionar, se debe verificar si el elemento de cabecera pertenece al rango actual, si no pertenece al rango actual, se elimina. En la cola procesada, el elemento de cabecera es el elemento más pequeño en la ventana deslizante con el elemento empujado como el límite derecho, hasta que se presiona el último número, y se puede obtener el valor mínimo de todas las ventanas en este momento.
Del mismo modo, se puede establecer una cola monotónicamente decreciente para encontrar el valor máximo de cada posición de la ventana.

Código

#include <iostream>

using namespace std;

const int N = 1e7 + 10;
int min0[N], max0[N], q[N],a[N];
int n, k;

void solvemin()
{
	int l = 1, r = 0;
	for (int i = 1; i <= n; i++)
	{
		while (r >= l && a[q[r]] >= a[i])
			r--;
		q[++r] = i;
		if (q[r] - q[l] + 1 > k)
			l++;
		min0[i] = a[q[l]];
	}
}

void solvemax()
{
	int l = 1, r = 0;
	for (int i = 1; i <= n; i++)
	{
		while (r >= l && a[q[r]] <= a[i])
			r--;
		q[++r] = i;
		if (q[r] - q[l] + 1 > k)
			l++;
		max0[i] = a[q[l]];
	}
}

int main()
{
	while (scanf("%d %d",&n,&k)!=EOF)
	{
		for (int i = 1; i <= n; i++)
			scanf("%d", &a[i]);
		solvemin();
		solvemax();
		cout << min0[k];
		for (int i = k + 1; i <= n; i++)
			cout << ' ' << min0[i];
		cout << endl;
		cout << max0[k];
		for (int i = k + 1; i <= n; i++)
			cout << ' ' << max0[i];
		cout << endl;
	}
	return 0;
}

32 artículos originales publicados · Me gusta0 · Visitas 682

Supongo que te gusta

Origin blog.csdn.net/qq_43814559/article/details/105001771
Recomendado
Clasificación