求逆序对
先上归并的代码,吃点补线段树和树状数组的
因为不知道要多组输入wa了好几次
#include<cstdio>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int N = 1e6+10;
int arr[N],a[N];
ll ans,n;
void mry(int l,int r)
{
if(l==r)return;
int mid=l+r>>1;
mry(l,mid);
mry(mid+1,r);
int p=l,tot=l,i=mid+1;
while(tot<=r)
{
if( (arr[p]<arr[i] && p<=mid) || i>r )
a[tot++]=arr[p++];
else
{
ans+=mid-p+1;
a[tot++]=arr[i++];
}
}
for(i=l;i<=r;i++)
arr[i]=a[i];
}
int main()
{
while(cin>>n){
ans=0;
for(int i=1;i<=n;i++)
cin>>arr[i];
mry(1,n);
cout<<ans<<endl;
}
return 0;
}