Calculando la mediana

SPOJ - Calculando la Mediana
[http://www.spoj.pl/BOLIVIA/problems/BOMEDIAN/ 6551. C – Calculando la mediana]

Este problema consiste en que por cada caso tenemos n(n<=10000) enteros de 32 bits, y tenemos que imprimir la mediana cada vez que nuestra secuencia tenga longitud impar.

Solución Ingenua
Cada vez que tengamos que imprimir la mediana, ordenamos nuestro vector e imprimimos el valor del medio del vector. Obviamente este problema está pensado para que está solución (n²logn) no nos lleve al ansiado AC.

Divide and Conquer
Ya existe un algoritmo Divide and Conquer.

http://www.algoritmia.net/articles.php?id=34

Usando Arboles
Una árbol de intervalos nos inserta un objeto en log(n), 15 iteraciones para este caso, pero la implementación con matriz nos almacena valores de 0 a 10⁶ aprox. pero en esta entrada de datos tenemos valores más grandes e incluso negativos. Pero podemos dar un segundo valor x (0<=x<=10⁶) a cada valor de la secuencia, como? Los mapas nos serán de gran ayuda. Con esto simplemente es ir adicionando valores a nuestro árbol de intervalos e ir mostrando el valor del medio.

Está solución tiene como complejidad O(nlogn) a esto habria que añadirle la complejidad de usar el Map.

A continuación se presenta una implementación en C++, los dos primeros métodos son la implementación del árbol de intervalos. using namespace std; int vc[MAX],sor[MAX]; int tree[Y][MAX]; void adicionar(int k){ for(int i=0;i mp; for(int i=0;i0) printf(" "); int p=buscar((i/2)+1); printf("%d",sor[p]); k++; }    printf("\n"); } int main{ int n;    scanf("%d",&n); for(int i=1;i<=n;i++) resuelva; }
 * 1) include
 * 2) include
 * 3) include
 * 4) include
 * 5) include
 * 6) define MAX 10009
 * 7) define Y 16