听说有笔试题。复习了下逆序对。
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <string>
using namespace std;
int a[1005];
int x[1005];
int ans=0;
void Union(int l,int r){
int mid=(l+r)>>1;
int cnt=0;
int ll=l,rr=mid+1;
while(ll<=mid&&rr<=r){
if( a[ll] <= a[rr] ){
x[++cnt]=a[ll];
ll++;
}
else{
x[++cnt]=a[rr];
rr++;
ans+=mid-ll+1;
}
}
while(ll<=mid)
x[++cnt]=a[ll++];
while(rr<=r)
x[++cnt]=a[rr++];
for(int i=l;i<=r;i++)
a[i]=x[i-l+1];
}
void merge_sort(int l,int r){
if(l<r){
int mid=(l+r)>>1;
merge_sort(l,mid);
merge_sort(mid+1,r);
Union(l,r);
}
}
int main()
{
int n;
scanf("%d\n",&n);
for(int cs=1;cs<=n;cs++){
char op;
int num;
int cnt=0;
ans=0;
scanf("%d",&cnt);
for(int i=1;i<=cnt;i++)
scanf("%d",&a[i]);
merge_sort(1,cnt);
printf("Scenario #%d:\n",cs);
printf("%d\n",ans);
if(cs!=n) printf("\n");
}
}