解題思路:
歸併排序
#include<iostream>
using namespace std;
const int inf = 2000001;
int v[2010];
int t[2010];
int m,n;
int ans = 0;
void msort(int l,int r)
{
int mid = (l+r)/2;
int s1 = l;
int s2 = mid + 1;
int s3 = 0;
while(s1<=mid && s2<=r)
{
if(v[s1]<=v[s2])
{
t[s3] = v[s1];
s3++;
s1++;
}
else if(v[s2]<v[s1])
{
t[s3] = v[s2];
s3++;
s2++;
ans += mid - s1 + 1;
}
}
if(s1<=mid)
for(int i=s1;i<=mid;i++)
{
t[s3] = v[i];
s3++;
}
if(s2<=r)
for(int i=s2;i<=r;i++)
{
t[s3] = v[i];
s3++;
}
int s4 = l;
for(int i=0;i<s3;i++)
{
v[s4] = t[i];
s4++;
}
return;
}
int main()
{
cin>>m;
int ex = 0;
while(m--)
{
cin>>n;
ans = 0;
ex++;
for(int i=0;i<1010;i++)
v[i] = inf;
for(int i=0;i<n;i++)
cin>>v[i];
int k = 2;
while(k<2*n)
{
for(int i=0;i<n;i+=k)
msort(i,i+k-1);
k = k*2;
}
cout<<"Scenario #"<<ex<<":"<<endl;
cout<<ans<<endl<<endl;
}
return 0;
}