Sacrificio#11805

Sacrificio (Editorial)

Autor del problema:

Hasan Saleh (MathModel)

Preparado por:

Hasan Saleh (MathModel)

Editado por:

Hasan Saleh (MathModel)

Consejos:

1) Ten en cuenta que cualquier número de intercambios es equivalente a permutar la matriz en cualquier matriz.

2) El valor de no importa en el valor real.

3) La forma óptima es ordenar la matriz en orden descendente y seleccionar enteros en función de eso.

4) Verificación para el problema - comprobando ciclos de matriz completos y los elementos restantes más grandes.

Solución

Podemos realizar un número infinito de intercambios, lo que también significa (cambiar el orden), la elección óptima es ordenar la matriz en orden descendente, y aplicamos las propiedades de los ciclos, estableciendo a k \bmod n desde las posiciones hasta m+k-1, agregamos el número más grande a su posición, es decir, [mayor, menor, aún menor, ..., el más pequeño], finalmente, agregamos el resto a cualquier posición ya que no afectará el área seleccionada.

Complejidad O(n \log n) debido al uso de mapas.

for _ in range(int(input())):
    n, m, k = map(int, input().split())
    arr = list(map(int, input().split()))
    a = sorted(arr, reverse=True)
    r = k % n
    c = [None] * n
    for i in range(r):
        pos = (m - 1 + i) % n
        c[pos] = a[i]
    mp = {}
    for x in arr:
        mp[x] = mp.get(x, 0) + 1
    for i in range(r):
        mp[a[i]] -= 1
        if mp[a[i]] == 0:
            del mp[a[i]]
    rem = []
    for x, cnt in mp.items():
        rem.extend([x] * cnt)
    it = iter(rem)
    for i in range(n):
        if c[i] is None:
            c[i] = next(it)
    print(*c)