Min Max Sort
Solución
Explicación
Si nuestro arreglo está ordenado, entonces no necesitamos realizar ninguna operación. Por lo tanto, nuestra respuesta será . En caso contrario, tenemos que pensar en cómo se vería nuestra última operación para hacer que el arreglo quede ordenado como: . Podemos deducir una pista importante de las operaciones mencionadas en el enunciado: nuestra última operación debe mover al frente del arreglo, y al final del arreglo para que quede ordenado.
Así que ahora sabemos cuál será nuestra última operación. Enfoquémonos en los elementos restantes: . Podemos aplicar el mismo análisis de arriba. O bien los números ya están ordenados, o necesitamos mover al frente y al final. Seguimos repitiendo esto hasta que nuestro segmento restante esté ordenado.
En cada paso, necesitamos comprobar si los números del segmento están ordenados o no. Aquí, el segmento se refiere al subconjunto de valores (es decir, los números de ), y comprobamos si aparecen en orden creciente de sus posiciones en el arreglo. Una observación clave aquí es que si un segmento está ordenado para algún valor , entonces estará ordenado también para valores mayores. Así que podemos empezar con el valor máximo de (es decir, ) y expandirnos hacia afuera mientras el segmento siga ordenado. El punto en el que ya no podemos expandir nos da el mayor segmento medio ordenado, y el número de elementos que quedan afuera dividido por es nuestra respuesta, ya que cada operación arregla un par de elementos.
Para cada , necesitamos verificar dos pares de extremos:
- ¿El número está a la izquierda de en el arreglo? (es decir, )
- ¿El número está a la izquierda de en el arreglo? (es decir, )
Implementación
Complejidad temporal:
#include <iostream>
#include <vector>
int main() {
int test_num;
std::cin >> test_num;
for (int t = 0; t < test_num; t++) {
int n;
std::cin >> n;
std::vector<int> index(n);
for (int i = 0; i < n; i++) {
int x;
std::cin >> x;
x--;
index[x] = i;
}
int lo = n / 2;
int hi = n - lo;
while (lo > 0 && index[lo - 1] < index[lo] && index[hi] > index[hi - 1]) {
lo--;
hi++;
}
std::cout << lo << '\n';
}
}import java.io.*;
import java.util.*;
public class MinMaxSort {
public static void main(String[] args) throws Exception {
Kattio io = new Kattio();
int testNum = io.nextInt();
for (int t = 0; t < testNum; t++) {
int n = io.nextInt();
int[] index = new int[n];
for (int i = 0; i < n; i++) {
int x = io.nextInt() - 1;
index[x] = i;
}
int lo = n / 2;
int hi = n - lo;
while (lo > 0 && index[lo - 1] < index[lo] && index[hi] > index[hi - 1]) {
lo--;
hi++;
}
io.println(lo);
}
io.close();
}
// BeginCodeSnip{Kattio}
}for _ in range(int(input())):
n = int(input())
arr = list(map(int, input().split()))
index = [0] * n
for i in range(n):
index[arr[i] - 1] = i
lo = n // 2
hi = n - lo
while lo > 0 and index[lo - 1] < index[lo] and index[hi] > index[hi - 1]:
lo -= 1
hi += 1
print(lo)