https://vjudge.net/problem/POJ-1804
求把一个序列通过两两交换变成有序序列需要的交换次数。
即求逆序对数
用归并排序可以顺便求出逆序对数
醉了,这题不能带上while(scanf("%d",&n)!=EOF),否则一直WA
//poj 1804 逆序对
const int maxn = 1000+5;
int a[maxn],t[maxn];
int cnt;
//归并排序
void merge_sort(int* A,int x,int y,int* T){
if(y-x > 1){
int m = x + (y-x)/2 ;
int p = x,q = m , i = x;
merge_sort(A,x,m,T);
merge_sort(A,m,y,T);
while(p < m || q < y){
if(q>=y || (p<m && A[p] <= A[q])) T[i++] = A[p++];
//加一个cnt计算逆序对数,其他完全是归并排序代码
else {T[i++] = A[q++];cnt += m-p;}
}
for(i=x;i<y;i++) A[i] = T[i];
}
}
int main(){
int n,m;
scanf("%d",&n);
int nn = 1;
while(n--){
scanf("%d",&m);
for(int i=0;i<m;i++)
scanf("%d",a+i);
cnt = 0;
merge_sort(a,0,m,t);
printf("Scenario #%d:\n%d\n\n",nn++,cnt);
}
return 0;
}