Par de orden inverso P1908 (Luogu)

Portal de título original

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Idea: Esta pregunta es realmente un pozo, el método de violencia directa tiene que detenerse, agregar una plantilla de clasificación de combinación y prestar atención a cómo encontrar el número de pares inversos, porque los dos párrafos están en orden, así que busque uno en el anterior. párrafo que el del último Cuando es grande, todos los números después del párrafo anterior son más grandes que él, y el número estadístico es m-i + 1. Este es el punto clave de esta pregunta. Entonces el algoritmo es dividir y Conquer + Merge Sort, que implica la recursividad del proceso de.

Referencia de código

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 500005;
int n,a[MAXN],temp[MAXN];
long long ans=0;
//归并排序
void merge(int l,int r)
{
    
    
    if(l==r)
        return;
    int m=(l+r)/2;
    merge(l,m);
    merge(m+1,r);
    int i=l,j=m+1,k=l;
    while(i<=m && j<=r)
    {
    
    
        if(a[i]>a[j])
        {
    
    
            temp[k]=a[j];
            k++;
            j++;
            ans+=(m-i+1);//统计逆序对的数量
        }
        else
        {
    
    
            temp[k]=a[i];
            k++;
            i++;
        }
    }
    while(i<=m)
    {
    
    
        temp[k]=a[i];
        k++;
        i++;
    }
    while(j<=r)
    {
    
    
        temp[k]=a[j];
        k++;
        j++;
    }
    for(i=l;i<=r;i++)
        a[i]=temp[i];
}
int main()
{
    
    
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    merge(1,n);
    cout<<ans;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/Bertil/article/details/106818042
Recomendado
Clasificación