码迷,mamicode.com
首页 > 其他好文 > 详细

求逆序对

时间:2019-11-04 17:23:30      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:+=   没有   树状数组   树状   计算   div   void   font   col   

逆序对

首先我们来认识一下什么叫做逆序对:如果对于 i<j,a[i]>a[j],那么a[i]和a[j]就是一对逆序对

树状数组求逆序对

我们挨个把a数组放进树状数组里,对于每一个a[i],统计a[1...i-1]中有多少个数比a[i]大,就有多少对逆序对

int n=read();
for (int i=1;i<=n;i++){
    int x=read();  //读入a数组
    add(x,1);  //将b[x]的值加一
    ans+=i-sum(x);  //sum(x)求出a[1...i]中有多少个数小于等于a[i]
} 
printf("%d\n",ans);

 

归并排序求逆序对

归并排序是一种基础的排序方法。

当然,在c++中允许使用STL后,归并渐渐地不常用了,毕竟任何一种排序方法都没有sort来的爽快

然而,归并还是有着自己的优势的,其中最突出的一点就是能够计算逆序对

 

void merge_sort(int l,int r){
    if(l>=r) return;
    int mid=(l+r)/2;
    merge_sort(l,mid);
    merge_sort(mid+1,r);
    int i=l,j=mid+1,k=l;
    while(i<=mid||j<=r){
        if((a[i]<=a[j]&&i<=mid)||j>r){
            b[k++]=a[i++];
        }
        else{
            ans+=mid-i+1;
            b[k++]=a[j++]; 
        }    
    }
    for (int i=l;i<=r;i++) a[i]=b[i];
}

 

求逆序对

标签:+=   没有   树状数组   树状   计算   div   void   font   col   

原文地址:https://www.cnblogs.com/yulinss/p/11792856.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!