https://www.luogu.org/problemnew/show/P1908
解法一:枚举每个序列的第一个位置,对于第二个位置,然后枚举整个序列查看构成整个的序列是否是逆序列
解法二:先排序,然后再求逆序列:
#include<cstdio>
#include<iostream>
using namespace std;
int n;
int a[500005];
long long res = 0;
void mergesort(int a[], int s, int e)
{
if(s == e)
return ;
int k = 0;
int tmp[500005];
int mid = s + (e - s)/2;
mergesort(a, s, mid);
mergesort(a, mid + 1, e);
int i = s, j = mid + 1;
//合并
while(i <= mid && j<=e )
{
if(a[i] <= a[j])
{
tmp[k++] = a[i++];
}
else
{
tmp[k++] = a[j++];
res += mid - i + 1;//a[i]-a[mid]都比a[j]大
}
}
while(i <= mid)
tmp[k++] = a[i++];
while(j <= e)
tmp[k++] = a[j++];
for(int i = 0; i < e - s +1; i++)
a[s+i] = tmp[i];
}
int main()
{
//cin>>n;
scanf("%d", &n);
for(int i = 0; i <n; i++)
scanf("%d", &a[i]);
mergesort(a, 0, n-1);
cout<<res<<endl;
//system("pause");
}