Combinar ordenación para resolver el problema del logaritmo inverso

Dada una secuencia entera de longitud n, cuente el número de pares inversos en la secuencia.

La definición del par de orden inverso es la siguiente: Para los elementos i-ésimo y j-ésimo de la secuencia, si i <j y a [i]> a [j] se satisfacen, entonces es un par de orden inverso ; de lo contrario, no lo es.

Formato de entrada La
primera línea contiene el número entero n, que representa la longitud de la secuencia.

La segunda línea contiene n números enteros, que representan la secuencia completa.

Formato de
salida Genera un número entero, que indica el número de pares en orden inverso.

Rango de datos
1≤n≤100000
ejemplo de entrada:

6
2 3 4 5 6 1

Salida de muestra:

5

El código C ++ es el siguiente:

#include<iostream>
using namespace std;
#define N 100050

int sum = 0;
int tmp[N];
void merge_sort(int q[],int l ,int r)
{
    
    
    if(l>=r) return;
    int mid= l + r >> 1;
    
    merge_sort(q,l,mid);
    merge_sort(q,mid+1,r);
    
    int k= 0,i=l,j=mid+1;
    while(i<=mid&&j<=r)
        if(q[i]<=q[j]){
    
    
        	tmp[k++] = q[i++];
		} 
        else{
    
    
        	sum += mid - i + 1;
        	tmp[k++] = q[j++];
		} 
    while(i<=mid) tmp[k++] = q[i++];
    while(j<=r) tmp[k++] = q[j++];
    
    for(i=l,j=0;i<=r;i++,j++)
    q[i]= tmp[j];
}


int main()
{
    
    
    int q[N];
    int n;
    cin >> n;
    for(int i = 0 ; i < n ; i ++) cin >> q[i];
    merge_sort(q,0,n-1);
    cout << sum;
    
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/diviner_s/article/details/107317196
Recomendado
Clasificación