#include<cstdio> #include<cstdlib> using namespace std; long long res = 0; void juntar(int* lista, const int& ini,const int& med, const int& fin) { int vector[fin - ini + 1]; int i = ini; int j = med + 1; int k = 0; while (i <= med && j <= fin) if (lista[i] <= lista[j]) vector[k++] = lista[i++]; else vector[k++] = lista[j++], res += med - i + 1; while (i <= med) vector[k++] = lista[i++]; while (j <= fin) vector[k++] = lista[j++]; for (i = 0; i < k; i++) lista[ini + i] = vector[i]; //free(vector); } void merge_sort(int* lista,const int& ini,const int& fin) { if (ini < fin) { int med = (ini + fin) / 2; merge_sort(lista, ini, med); merge_sort(lista, med + 1, fin); juntar(lista, ini, med, fin); } } void mostrar(int* lista, const int& n) { for (int i = 0; i < n; i++) printf("%d ", *(lista + i)); printf("\n"); } int main() { int n, lista[500000]; while(scanf("%d", &n)) { if (n == 0) break; res = 0; for (int i = 0; i < n; i++) scanf("%d", lista + i); merge_sort(lista, 0, n - 1); printf("%lld\n", res); } return 0; }
jueves, 20 de octubre de 2011
10810 - Ultra-QuickSort - UVA
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario