#include<cstdio>
#include<vector>
using namespace std;
long long merge_count(vector<int>&a)
{
int n=a.size();
if(n<=1)
return 0;
long long cnt=0;
vector<int>b(a.begin(),a.begin()+n/2);
vector<int>c(a.begin()+n/2,a.end());
cnt+=merge_count(b);
cnt+=merge_count(c);
int ai=0,bi=0,ci=0;
while(ai<n)
{
if(bi<b.size()&&(ci==c.size()||b[bi]<=c[ci]))
{
a[ai++]=b[bi++];
}
else
{
cnt+=n/2-bi;
a[ai++]=c[ci++];
}
}
return cnt;
}
int main()
{
vector<int>A;
int i,n,a;
while(~scanf("%d",&n)&&n)
{
for(i=0;i<n;i++)
{
scanf("%d",&a);
A.push_back(a);
}
printf("%lld\n",merge_count(A));
while(!A.empty())
A.pop_back();
}
}
poj 2299 求逆序数
最新推荐文章于 2019-08-05 15:47:47 发布