归并方法求逆序对(洛谷1908逆序对)

来源:互联网 发布:广州乐乎城市青年社区 编辑:程序博客网 时间:2024/05/30 07:13
逆序对问题,给定一个序列,求逆序对的对数。

参考刘汝佳的书:由于合并操作是从小到大进行的,当右边的A[j]复制到T中,右边的比左边还没有来得及复制的数要大,在答案加上m-p即可。

#include<bits/stdc++.h>using namespace std;int A[50000],T[50000];int cnt=0;int n;void merge_sort(int x,int y)//[x,y){if(y-x>1){int m=x+(y-x)/2;//注意这种写法 int p=x,q=m,i=x;merge_sort(x,m);merge_sort(m,y);//[x,m),[m,y)while(p<m||q<y){if(q>=y||p<m&&p<m&&A[p]<=A[q]) T[i++]=A[p++];else T[i++]=A[q++],cnt+=m-p;//每一次搜索右边的时候就相当于右边的比左边还没有来得及复制的数要大 }for(int i=x;i<y;i++)A[i]=T[i];//复制回A数组当中去 }}//归并排序 O(nlog2n) O(n) 稳定 较复杂int main(){cin>>n;for(int i=1;i<=n;i++)cin>>A[i];merge_sort(1,n+1);cout<<cnt<<endl;}