#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