Portal de título original
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;
}