poj1804 归并排序求逆序对

来源:互联网 发布:淘宝的详情页在线制作 编辑:程序博客网 时间:2024/04/29 03:03
#include<iostream>#include<cstdio>#include<cstdlib>using namespace std;const int maxn=1005;int tmp[maxn],a[maxn];int ans;void merge(int l,int mid,int r){    int i=l,j=mid+1,k=l;    while(i<=mid&&j<=r)    {        if(a[i]>a[j])        {            tmp[k++]=a[j++];            ans+=mid+1-i;        }        else            tmp[k++]=a[i++];    }    while(i<=mid) tmp[k++]=a[i++];    while(j<=r) tmp[k++]=a[j++];    for(int i=l;i<=r;i++)        a[i]=tmp[i];}void merge_sort(int l,int r){    if(l<r)    {        int mid=(l+r)>>1;        merge_sort(l,mid);        merge_sort(mid+1,r);        merge(l,mid,r);    }}int main(){    int n,t,cnt=0;    scanf("%d",&t);    for(int i=1;i<=t;i++)    {        cnt++;        ans=0;        scanf("%d",&n);        for(int i=1;i<=n;i++)            scanf("%d",&a[i]);        merge_sort(1,n);        printf("Scenario #%d:\n%d\n\n",cnt,ans);    }    return 0;}
3 0