--- especie de súper rápida inversa

En este problema, debe analizar algoritmo de ordenación específica ---- secuenciación ultra-rápido.
El algoritmo de conmutación adyacentes dos elementos de secuencia para procesar diferentes números enteros n secuencia hasta que la secuencia en orden ascendente.
Para una secuencia de entrada de 91054, generar una salida ultra-rápido especie 01.459.
Su tarea consiste en determinar el número de operación de conmutación ultra-rápido para ordenar las necesidades que se deben realizar para una orden de la secuencia de entrada.
El formato de entrada
de entrada incluye un número de casos de prueba.
La primera línea de cada caso de prueba entero de entrada n, que representa el caso con la longitud de la secuencia de entrada.
Los siguientes n líneas cada uno entran en un número entero AIAI, entrada de datos de la secuencia específica de la realización representativa, de datos que representa la i-ésima secuencia en la i-ésima fila.
Cuando la forma de realización de entrada de entrada de secuencia comprende una longitud de 0, la entrada se termina, la necesidad de secuencia del proceso.
Formato de salida
Para cada secuencia de entrada a procesar, la salida de un op número entero, representante de una secuencia de entrada dado de operaciones de conmutación requiere el número mínimo de clasificación, fila para cada número entero.
Datos gama
0≤N <5000000≤N <500000,

0≤ai≤9999999990≤ai≤999999999
muestra de entrada:
. 5
. 9
. 1
0
. 5
. 4
. 3
. 1
2
. 3
0

Muestra de la salida:
. 6
0

Ideas: el número dos de tiempo adyacente, el número de cambio inverso 1 por intercambio

#include <cstdio>
using namespace std;
typedef long long LL;
const int N = 500010;
int n;
LL q[N], w[N];
LL merge_sort(int l, int r){
 if (l >= r)   return 0;
 int mid = l + r >> 1;
 LL res = merge_sort(l, mid) + merge_sort(mid + 1, r);
 int i = l, j = mid + 1, k = 0;
 while(i <= mid && j <= r)
 if (q[i] < q[j])   w[k ++] = q[i ++];
 else{
  w[k ++] = q[j ++];
  res += mid - i + 1;
 }   
 while(i <= mid)   w[k ++] = q[i ++];
 while(j <= r)     w[k ++] = q[j ++];
  for (i = l, j = 0; i <= r; i ++, j ++)   q[i] = w[j];
 return res;
} 
int main(){
 while(~scanf("%d", &n), n){
  for (int i = 0; i < n; i ++)   scanf("%d", &q[i]);
  printf("%lld\n", merge_sort(0, n - 1));
 }
 return 0;
}
Publicados 106 artículos originales · ganado elogios 67 · vistas 5437

Supongo que te gusta

Origin blog.csdn.net/qq_45772483/article/details/104786325
Recomendado
Clasificación