# 题意翻译:
多组数据,给定一个长度为 n 的数列,求其中逆序对的个数。
# ~~切记:~~
翻译有问题 !!!
如果你如果你不写多组数据你就会
# 思路:
逆序对,题解区的 dalao 好像并没有描述逆序对的原理,这可能直接导致蒟蒻无法解决此题。
如图(归并排序):
在合并时,如图第 5 行,合并成第 6 行: " 3,7 " 与 " 1,5 " 和并时 "3"
与 "1" 比较 "3" 更大应改到后面去,又因要合并的两个集合早已排列好,所以这是产生了两组逆序对。(不懂可以手动模拟)
# AC CODE:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int b[10000010],a[10010100],sum;
void msort(int l,int r) //归并排序
{
if(l==r)
return;
int mid=(l+r)/2;
msort(l,mid);
msort(mid+1,r);
int n=l,m=mid+1,k=l;
while(n<=mid&&m<=r)
{
if(a[n]<=a[m])
{
b[k]=a[n];
n++;
k++;
}
else
{
sum+=mid-n+1;//关键语句
b[k]=a[m];
k++;
m++;
}
}
while(n<=mid)
{
b[k]=a[n];
n++;
k++;
}
while(m<=r)
{
b[k]=a[m];
m++;
k++;
}
for(int i=l;i<=r;i++)
a[i]=b[i];
}
signed main(){
int n;
while(cin>>n)//坑点:多组数据
{
sum=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
msort(1,n);//进入函数
cout<<sum<<'\n';
}
return 0;
}