You are on page 1of 14

SEGMENT TREES

JONATHAN DURAND ESPINOZA Hamlet_fiis


FACULTAD ING SISTEMAS UNIVERSIDAD NACIONAL DE INGENIERIA

SEGMENT TREES
Esta estructura de datos puede ser usado para

realizar querys y updates sobre intervalos de un arreglo en tiempo logaritmico. Consideraciones importantes
Cada nodo contendr la informacin sobre un intervalo

[i,j] n=10 Un nodo padre debe ser definido mediante sus nodos hijos directos.

SEGMENT TREES
Almacenaremos todos estos nodos (segmentos) en un solo arreglo.

Memoria adicional ? Podemos notar que el tamao del arbol es [logn]+1. La cantidad de nodos se aproxima a 2*2^(h) Tener en cuenta que en el ultimo nivel no todos los n=10 nodos, han sido utilizados. Como buena practica declarar tu tree[4*n]. 4n=2*2^(logn+1)

Cmo lo codeamos?. Qu debemos tener en cuenta?. Como se va almacenar en un arreglo (tree) necesitamos un parametro que nos diga el indice. Cada nodo se representa por los siguientes parametros. Node , a ,
b
2*Node+1 , a , (a+b)/2 2*Node+2 , (a+b)/2+1,b

Nodo y el intervalo en el arreglo. Cada uno lo identifica por separado pero lo almacenaremos por comodidad.

Como quedaria? 0
1
2 3 4 5 10 23 11 24 12 6 13 14

7 15

16

Ntese que solo necesitamos 25 nodos para

n=10 pero no se utilizo el nodo 17,18,19,22

Que problemas podemos resolver?

Cmo reconocer si un problema se resuelve con

Segment Tree? Si encontramos la relacion del nodo padre con sus nodos hijos. Quiero encontrar la suma, minimo? [ nodo padre] [nodo izquierdo] [nodo derecho] Nodo padre= nodo izquierdo +nodo derecho Nodo padre= min(nodo izquierdo , nodo derecho)

Problemi
Deseamos una estructura de datos que nos

soporte las siguientes operacines. Operacin 0 : Obtener el minimo entre los indices [A-B] Operacin 1 : Actualizar el elemento A y setearle val

N=10^5 Cantidad de operacines 10^5 Segment trees :D

Init O(n) Query O(logn) Update

Problemi 2. GSS3 (http://www.spoj.pl/problems/GSS3/)


You are given a sequence A of N (N <= 50000) integers between

-10000 and 10000. On this sequence you have to apply M (M <= 50000) operations: modify the i-th element in the sequence or for given x y print max{Ai + A(i+1) + .. + Aj | x<=i<=j<=y }. Input The first line of input contains an integer N. The following line contains N integers, representing the sequence A1..AN. The third line contains an integer M. The next M lines contain the operations in following form: 0 x y: modify Ax into y (|y|<=10000). 1 x y: print max{Ai + A(i+1) + .. + Aj | x<=i<=j<=y }. Output For each query, print an integer as the problem required.

Como hago este problema?. Dado un intervalo [x,y], imprimir la mxima Suma A[i],A[i+1],--- ,A[j]. El tree requiere 4 parmetros para obtener este resultado. La mxima suma que es prefijo del segmento. La mxima suma que es sufijo del segmento. La mxima suma del segmento (Variable respuesta). La suma del segmento. Como el tree requiere de 4 parmetros entonces necesitamos crear una estructura.

Init O(n) El tree contiene 4 parametros mencionados

anteriormente. El mejor prefijo de un nodo . Es el maximo del prefijo del nodo izquierdo con la suma total del nodo izquierdo + prefiijo nodo derecho. Dibujar para darse cuenta.

GRACIAS CHE CULIAOS!!!

Cualquier cosa pregunten a:

Resuelvanse todas. http://ahmedaly.com/UVaAndSPOJ/Category.jsp?CategoryID=25

You might also like