ACM ICPC Training Camp

download ACM ICPC Training Camp

of 19

description

ACM PUCMM

Transcript of ACM ICPC Training Camp

  • Range Queries

    PUCMM ACM-ICPC Training Camp

    BIT, Segment Trees (RMQ)

  • Range QueriesSe refiere al diseo de estructuras de datos para responder eficientemente consultas sobre algn intervalo o sub-conjunto de una data.

    Definicin: Un Range Query es un 5-tupla RQ = {A, S, i, j, f} donde: A es el arreglo A = [a0, a1, a2, ..., an-1] sobre el cual se realiza la

    consulta. S es el conjunto de donde provienen los elementos de A. i es el lmite izquierdo del rango a consultar. j es el lmite derecho del rango a consultar. es la funcin de consulta definida sobre el arreglo A de

    elementos que provienen de S.

    Ejemplos de Range Queries sobre A = [1, 2, 8, 3, 9, 2, 9]: Cul es el mnimo elemento entre [2,5]: 2. Cul es el mximo elemento enbre [0, 3]: 8. Cul es la suma cumulativa de [0, 2]: 11.

  • Binary Indexed Trees (BIT)Estructuras para el clculo y manipulacin eficiente de sumas cumulativas (tambin conocidas como sumas de prefijos).

    Note que una suma cumulativa es lo mismo que una suma parcial de una serie.

    O sea:

    Tambin conocidos como "Fenwick Trees" en pases de Europa del este.

  • Justificacin para uso de BITHagmos lo primero que naturalmente llega a la mente. Asumamos que tenemos un arreglo X:

    Tenemos dos operaciones posibles:

    1. Incrementar Xi en K2. Sumar desde Xi hasta Xj

    La operacin (1) toma O(1) y la operacin (2) toma O(n). Si tenemos m operaciones de tipo (2) a realizar, esta solucin toma O(m * n).

    Posiblemente lo segundo que llega a la mente es tener un arreglo Y[0..n - 1] que almacene las sumas parciales X[0..i] para cada i. Construir este arreglo toma O(n). Sin embargo, si tenemos m actualizaciones, esto tomara O(m * n).

    BIT permite todo lo anterior en O(m log n) peor caso.

  • Bsicos de BITBIT ofrece solamente dos operaciones:

    SET(i,v): incrementa X[i] en v.

    GET(i): Devuelve X[0] + X[1] + ... + X[i]

  • Nmeros Binarios y Potencias de 2Resumen: Los nmeros enteros se pueden representar como sumas de potencias de dos.Ejemplo: 22 = 4^2 + 2^2 + 2.

    Aprovechando esta relacin, la manera de conseguir nuestra suma sera:

    Para el mismo 22, por ejemplo:S(1, 22) = S(1, 16) + S(17, 20) + S(21, 22)

  • GET: Consiguiendo los ndicesPara conseguir los ndices de BIT al hacer una suma, podemos utilizar funciones boolenas bitwise de nuestros lenguajes de programacin:

    i = i - (i & -i)

  • SET: Consiguiendo los ndicesPara conseguir los ndices de BIT al hacer una actualizacin, podemos utilizar funciones boolenas bitwise de nuestros lenguajes de programacin:

    i = i + (i & -i)

  • Implementacin en C++

    Versin en vivo: http://ideone.com/QP0Ol0

  • Problemas a resolver con BITSPOJ - "Increasing Subsequences" : http://www.spoj.pl/problems/INCSEQ/

    SPOJ - "Distinct Increasing Subsequenes": http://www.spoj.pl/problems/INCDSEQ/

    TOJ - "In The Army Now":http://acm.timus.ru/problem.aspx?space=1&num=1090

  • Segment Trees y RMQEstructuras de datos para almacenar intervalos (segmentos):

    Cul segmento contiene al punto x?Usualmente el punto "x" es una consulta del mnimo o mximo sobre un rango.

  • Idneos para RMQ

    Los rboles de segmento utilizan espacio proporcional a la altura de un rbol binario completo. En total precisan de [0, 2^(log2 N +1))].

    Preparar este espacio toma O(n). Posteriormente, cada operacin de consulta se realiza en O(log n).

    Para una serie de m consultas, el tiempo en el peor caso sera de O(m log n).

  • Bsicos de los Segment Trees Cada rango se enumera iniciando con el rango 1 (el rango completo).

    En un estilo divide y vencers, el rango se va dividiendo en dos rangos de tamao |n / 2| hasta llegar a la unidad.

    La enumeracin de los prximos rangos se hace de acuerdo en su orden de aparicin en el rbol de recursin formado por el proceso D&V (izquierda a derecha, de abajo hacia arriba).

    Usualmente la estructura es esttica. Una vez formado el Segment Tree, no se modifica.

  • IniciacinEsto es luego de crear M de tamao:

    La llamada principal debera ser: initialize(1, 0, n - 1, M, A, N);

  • Consultas

  • EjemploPara: [3 1 2]

  • Problemas a resolver con Segment TreeCOJ - "City Houses"http://coj.uci.cu/24h/problem.xhtml?abb=2067POJ - "Balanced Line-Up"http://poj.org/problem?id=3264

  • Notas finales

    Se puede utilizar tanto BIT como Segment Tree para sumas cumulativas.

    En la prctica generalmente BIT funciona mejor para bsquedas cumulativas.

  • Bibliografa

    danielp. Range Minimum Query and Lowest Common Ancestor. Retrieved Oct 24th, 2012, from http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor#Segment_Trees

    gvikey. Basic Binary Indexed Tree. Retrieved Oct 24th, 2012, from http://codeforces.ru/blog/entry/619?locale=en

    Wikipedia. Range Queries. Retrieved Oct 24th, 2012, from http://en.wikipedia.org/wiki/Range_Queries