Cómo resolver este problema en la búsqueda binaria

Sí, el enfoque de búsqueda binaria se puede aplicar aquí.

Considere este caso de prueba:

9 3 5

2 4 7

Entonces, la matriz resultante después de la eliminación será: 1 3 5 6 8 9

Dado que 8 está en el índice 5 (indexación 1), por lo tanto, la respuesta es 8

La clave para aplicar la búsqueda binaria es encontrar una función monótona. Entonces, ¿cuál es esa función en este problema?

Comparemos los índices iniciales y finales de los números en la matriz.

1: (inicial = 1, final = 1)

3: (inicial = 3, final = 2)

5: (5,3), 6: (6,4), 8: (8,5), 9: (9,6)

Entonces, final-inicial para cada valor es:

0 1 2 2 3 3

Voila! hemos encontrado nuestra función monótona, y eso es

f (x) = índice de x en la matriz final-índice de x en la matriz inicial

(el dominio de f es todos los valores presentes en la matriz final)

Entonces, ¿cómo codificar esto en forma de búsqueda binaria para encontrar la respuesta correcta?

tome el límite inferior para que la búsqueda binaria sea 1, y el límite superior cualquier valor solo mayor que N (es decir, 1e9). Ahora, para cada valor medio, repita la matriz de valores eliminados y cuente los valores que sean menores o iguales que el valor medio . (por ejemplo, almacena conteo en variable cnt )

¿Por qué estamos haciendo esto? porque necesitamos encontrar el nuevo índice de este valor medio.

¿Cómo encontrar el nuevo índice? Es muy facil. El nuevo índice está a mitad de camino . La razón de esto es que inicialmente el índice de valor medio era medio, y ahora después de eliminar todos los elementos menores o iguales al valor medio, el índice de valor medio ha disminuido en ese recuento.

largo largo int bajo = 1, alto = 1e9 + 10, medio, cnt;
mientras (bajo <alto)
{
medio = (bajo + alto) / 2;
cnt = 0;
para (int i = 0; i <k; i ++)
{
if (a [i] <= mid) cnt ++;
}
if (mid-cnt> = p) high = mid;
más bajo = medio + 1;
}
if (r <= n) cout << r << endl;
else cout << – 1 << endl; // idx p está fuera de la matriz final de tamaño Nk

La complejidad del tiempo será O (k * lgN)

¡Espero eso ayude!

ll A [100001];

int main ()

{

// ifstream cin (“in.txt”);

ll n, k, idx;

TC ()

{

scanf (“% lld% lld% lld”, & n, & k, & idx);

loopf (i, k) scanf (“% lld”, & A [i]);

ordenar (A, A + k);

ll alto = n + 1, bajo = 1, medio = -1, ans;

ll pos_of_mid, no_of_small_elements_then_mid;

if ((nk)

si no (A [0]> idx) ans = idx;

más

while (alto> = bajo)

{

medio = (alto + bajo) / 2;

no_of_small_elements_then_mid = lower_bound (A, A + k, mid) -A;

if (A [no_of_small_elements_then_mid] == mid) // codificación if mid se encuentra en la matriz excluida

{

int tp = no_of_small_elements_then_mid;

while (A [tp] == (medio))

{

tp ++;

mediados de ++;

}

no_of_small_elements_then_mid = tp;

}

pos_of_mid = mid – no_of_small_elements_then_mid; // encuentra cuál es el // pos de mid en la matriz real

if (pos_of_mid == idx) break; // la posición coincide con el índice dado se sale del bucle

sino if (pos_of_mid

más alto = mediados de 1;

}

if (mid! = – 1) ans = mid;

printf (“% lld \ n”, ans);

}

}

No estoy seguro de que la búsqueda binaria sea la solución ideal para esto, si es que es posible. El algoritmo Min Heap o Order Statistic debería ser la solución ideal para esto.

Lo mejor es crear un árbol de búsqueda binaria y seguir la solución para encontrar el kth más pequeño en un árbol de búsqueda binaria.

More Interesting

Cómo hacer que el software de mi sitio web lea un correo electrónico, capture la ID en el asunto y actúe en función de esa ID

¿Cuál es la diferencia entre array estático y automático?

¿Por qué el aprendizaje profundo requiere la construcción de modelos de datos generativos?

¿Cómo construiría una estructura de datos compartidos para un alto rendimiento y disponibilidad?

Procesadores de señal digital (DSP): cuando alguien escribe un archivo en una tarjeta SD usando un bus spi, ¿cómo sabe dónde debería estar el comienzo de un nuevo archivo?

Solo conozco algunos conceptos básicos de c ++. ¿Qué libros o tutoriales debo consultar para resolver problemas en spoj y codechef?

Cómo hacer que mis veranos sean productivos cuando mi interés radica en la codificación competitiva

¿Cómo se siente cuando te das cuenta de que no eres realmente bueno en programación y algoritmos?

Cómo escribir un programa en C para buscar los elementos usando el orden de fusión

¿Cuáles son algunos algoritmos clásicos de programación dinámica unidimensional?

¿Cómo verificamos la corrección de un algoritmo?

Cómo encontrar la Kth ruta más corta de un nodo a otro en un gráfico

¿Qué razones prácticas hay para que un no programador aprenda sobre estructuras de datos y / o algoritmos?

¿Existe un algoritmo ML para verificar qué tan bien coinciden 3 objetos de diferentes tipos?

En el 8 rompecabezas, ¿por qué solo es posible alcanzar la mitad de todas las combinaciones posibles desde cualquier estado dado?